From patchwork Wed Sep 13 10:00:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 112419 Delivered-To: patch@linaro.org Received: by 10.140.106.117 with SMTP id d108csp752073qgf; Wed, 13 Sep 2017 03:01:15 -0700 (PDT) X-Google-Smtp-Source: AOwi7QCsOVodmq6ifUK2YHz2KrK344JfZV9UPKA2kNJ5RcQ/7Q92vhOBtfBi0/u4yrQ2RFrwn5Rb X-Received: by 10.237.42.85 with SMTP id k21mr24999453qtf.289.1505296875043; Wed, 13 Sep 2017 03:01:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1505296875; cv=none; d=google.com; s=arc-20160816; b=GsuRhtBBenhmPak4TKhujo/ZzhDApijER7yD1VvCSh66QW0l/XvRnWyrqpAO3xLygY qJlKaD2imZP5NXg4fySfWSj0EoC7qaXaA2o2FQznVKnPmcMNsJ0QtJ2inqS7D9ZPfWCT xWeOvixBV5K9uSEbeFg43X/U2tRih1US1B0en3AaaErKctW++JMtdKLkNVYi2CBXzHrs asGjdBnwWVAzD04H7umIeVu6dd8LqqT+k5HAAQ8+Xuhg3Eikj/xe3v1AaHBNMns1uNrX lo1mkxO0Hi1LGXCpGIxlvMa3xc5nI9psHCFWF1zfdhJEWv7wNou6EdcOsYpz8WHVDgvR 7r5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=J2r00AKCYgb10JrIahKd4FRm7+e9spBVV3Laszw1PY8=; b=X9xGFStQztHsFf+A+weB4bdMGUfIqTCLXJ3aErRMD3dD5Hq1DIi+O+SqNUrpN6rlLh /zR4PdcgPzDj3fqPnKCoIk9LwBmpm34wWVxOwAXzrlNbiw0oLlU3rBR9sWNHzzeEZk2s QgpXSv4aJQiQAzBr+PTspimysjFPLYEV5Z4D0YqMXvKqHFiAS34w/NDfLu7vnNhAVwUS dbvfPlfO5G5Zkk9Iip6P9baZ4XCAkebMHloZyuYzi1RxN4HnTYNDeUcrDzArISP4JOps pLDMUdU9Hc+MZ3erxSb5C6tz+Ff9wKek9FNzz3kerGdPWgXI+PARwNtVZ5qORhsvPryE fZ8Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id g9si5514634qtf.204.2017.09.13.03.01.14; Wed, 13 Sep 2017 03:01:15 -0700 (PDT) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id 95B0160C60; Wed, 13 Sep 2017 10:01:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 3F0AA60C48; Wed, 13 Sep 2017 10:00:24 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id E02B060C1E; Wed, 13 Sep 2017 10:00:20 +0000 (UTC) Received: from forward106j.mail.yandex.net (forward106j.mail.yandex.net [5.45.198.249]) by lists.linaro.org (Postfix) with ESMTPS id CA31560C1D for ; Wed, 13 Sep 2017 10:00:17 +0000 (UTC) Received: from mxback12j.mail.yandex.net (mxback12j.mail.yandex.net [IPv6:2a02:6b8:0:1619::87]) by forward106j.mail.yandex.net (Yandex) with ESMTP id 7ADBE180412D for ; Wed, 13 Sep 2017 13:00:16 +0300 (MSK) Received: from smtp2j.mail.yandex.net (smtp2j.mail.yandex.net [2a02:6b8:0:801::ac]) by mxback12j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id w6DYYqHuls-0GS84MPq; Wed, 13 Sep 2017 13:00:16 +0300 Received: by smtp2j.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id tw2fZg62sp-0FGCpHOO; Wed, 13 Sep 2017 13:00:15 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Wed, 13 Sep 2017 13:00:08 +0300 Message-Id: <1505296808-16618-3-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1505296808-16618-1-git-send-email-odpbot@yandex.ru> References: <1505296808-16618-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 169 Subject: [lng-odp] [PATCH CLOUD-DEV v3 2/2] linux-dpdk:introduce buffer submodule X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Balakrishna Garapati Signed-off-by: Balakrishna Garapati --- /** Email created from pull request 169 (GBalakrishna:dpdk_buffer_submodule) ** https://github.com/Linaro/odp/pull/169 ** Patch: https://github.com/Linaro/odp/pull/169.patch ** Base sha: a1f50ad720e11a54b13c4786cad4687cb5c4ec2a ** Merge commit sha: dff16717c6e54c01ff51764e12d56fe938e87b86 **/ platform/linux-dpdk/Makefile.am | 3 + platform/linux-dpdk/buffer/dpdk.c | 128 +++++++++++++++++++++++++++++++++----- platform/linux-dpdk/pool/dpdk.c | 62 ------------------ 3 files changed, 114 insertions(+), 79 deletions(-) diff --git a/platform/linux-dpdk/Makefile.am b/platform/linux-dpdk/Makefile.am index a006d0da8..bf6485adf 100644 --- a/platform/linux-dpdk/Makefile.am +++ b/platform/linux-dpdk/Makefile.am @@ -168,6 +168,7 @@ odpdrvplatinclude_HEADERS = \ noinst_HEADERS = \ + ${top_srcdir}/platform/linux-generic/include/odp_buffer_subsystem.h \ ${top_srcdir}/platform/linux-generic/include/_fdserver_internal.h \ ${top_srcdir}/platform/linux-generic/include/_ishm_internal.h \ ${top_srcdir}/platform/linux-generic/include/_ishmphy_internal.h \ @@ -252,6 +253,7 @@ __LIB__libodp_dpdk_la_SOURCES = \ ../linux-generic/odp_rwlock.c \ ../linux-generic/odp_rwlock_recursive.c \ ../linux-generic/pool/subsystem.c \ + ../linux-generic/buffer/subsystem.c \ ../linux-generic/odp_schedule_if.c \ ../linux-generic/schedule/generic.c \ ../linux-generic/schedule/iquery.c \ @@ -300,6 +302,7 @@ __LIB__libodp_dpdk_la_SOURCES += arch/x86/cpu_flags.c \ endif pool/dpdk.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +buffer/dpdk.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE if ODP_SCHEDULE_SCALABLE ../linux-generic/schedule/scalable.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE else diff --git a/platform/linux-dpdk/buffer/dpdk.c b/platform/linux-dpdk/buffer/dpdk.c index 3c71fef84..f39ab31f1 100644 --- a/platform/linux-dpdk/buffer/dpdk.c +++ b/platform/linux-dpdk/buffer/dpdk.c @@ -7,30 +7,96 @@ #include #include #include +#include #include +#include #include #include #include -odp_buffer_t odp_buffer_from_event(odp_event_t ev) +static odp_buffer_t buffer_alloc(odp_pool_t pool_hdl) +{ + odp_buffer_t buffer; + pool_entry_cp_t *pool_cp; + pool_entry_dp_t *pool_dp; + + pool_cp = odp_pool_to_entry_cp(pool_hdl); + pool_dp = odp_pool_to_entry_dp(pool_hdl); + + ODP_ASSERT(pool_cp->params.type != ODP_POOL_BUFFER || + pool_cp->params.type != ODP_POOL_TIMEOUT); + + buffer = (odp_buffer_t)rte_ctrlmbuf_alloc(pool_dp->rte_mempool); + + if ((struct rte_mbuf *)buffer == NULL) { + rte_errno = ENOMEM; + return ODP_BUFFER_INVALID; + } + + buf_hdl_to_hdr(buffer)->next = NULL; + return buffer; +} + +static odp_buffer_t dpdk_buffer_alloc(odp_pool_t pool_hdl) +{ + ODP_ASSERT(ODP_POOL_INVALID != pool_hdl); + + return buffer_alloc(pool_hdl); +} + +static int dpdk_buffer_alloc_multi(odp_pool_t pool_hdl, + odp_buffer_t buf[], + int num) +{ + int i; + + ODP_ASSERT(ODP_POOL_INVALID != pool_hdl); + + for (i = 0; i < num; i++) { + buf[i] = buffer_alloc(pool_hdl); + if (buf[i] == ODP_BUFFER_INVALID) + return rte_errno == ENOMEM ? i : -EINVAL; + } + return i; +} + +static void dpdk_buffer_free(odp_buffer_t buf) +{ + struct rte_mbuf *mbuf = (struct rte_mbuf *)buf; + + rte_ctrlmbuf_free(mbuf); +} + +static void dpdk_buffer_free_multi(const odp_buffer_t buf[], int num) +{ + int i; + + for (i = 0; i < num; i++) { + struct rte_mbuf *mbuf = (struct rte_mbuf *)buf[i]; + + rte_ctrlmbuf_free(mbuf); + } +} + +static odp_buffer_t dpdk_buffer_from_event(odp_event_t ev) { return (odp_buffer_t)ev; } -odp_event_t odp_buffer_to_event(odp_buffer_t buf) +static odp_event_t dpdk_buffer_to_event(odp_buffer_t buf) { return (odp_event_t)buf; } -void *odp_buffer_addr(odp_buffer_t buf) +static void *dpdk_buffer_addr(odp_buffer_t buf) { odp_buffer_hdr_t *hdr = buf_hdl_to_hdr(buf); return hdr->mb.buf_addr; } -uint32_t odp_buffer_size(odp_buffer_t buf) +static uint32_t dpdk_buffer_size(odp_buffer_t buf) { odp_buffer_hdr_t *hdr = buf_hdl_to_hdr(buf); struct rte_mbuf *mbuf = (struct rte_mbuf *)hdr; @@ -52,7 +118,7 @@ void _odp_buffer_type_set(odp_buffer_t buf, int type) hdr->type = type; } -int odp_buffer_is_valid(odp_buffer_t buf) +static int dpdk_buffer_is_valid(odp_buffer_t buf) { /* We could call rte_mbuf_sanity_check, but that panics * and aborts the program */ @@ -71,43 +137,71 @@ int odp_buffer_snprint(char *str, uint32_t n, odp_buffer_t buf) hdr = buf_hdl_to_hdr(buf); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, "Buffer\n"); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, " pool %p\n", hdr->mb.pool); - len += snprintf(&str[len], n-len, - " phy_addr %"PRIu64"\n", hdr->mb.buf_physaddr); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, + " phy_addr %" PRIu64 "\n", hdr->mb.buf_physaddr); + len += snprintf(&str[len], n - len, " addr %p\n", hdr->mb.buf_addr); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, " size %u\n", hdr->mb.buf_len); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, " ref_count %i\n", rte_mbuf_refcnt_read(&hdr->mb)); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, " odp type %i\n", hdr->type); return len; } -void odp_buffer_print(odp_buffer_t buf) +static void dpdk_buffer_print(odp_buffer_t buf) { int max_len = 512; char str[max_len]; int len; - len = odp_buffer_snprint(str, max_len-1, buf); + len = odp_buffer_snprint(str, max_len - 1, buf); str[len] = 0; ODP_PRINT("\n%s\n", str); } -uint64_t odp_buffer_to_u64(odp_buffer_t hdl) +static uint64_t dpdk_buffer_to_u64(odp_buffer_t hdl) { return _odp_pri(hdl); } -odp_pool_t odp_buffer_pool(odp_buffer_t buf) +static odp_pool_t dpdk_buffer_pool(odp_buffer_t buf) { return buf_hdl_to_hdr(buf)->pool_hdl; } + +odp_buffer_module_t dpdk_buffer = { + .base = { + .name = "dpdk_buffer", + .init_local = NULL, + .term_local = NULL, + .init_global = NULL, + .term_global = NULL, + }, + .buffer_alloc = dpdk_buffer_alloc, + .buffer_alloc_multi = dpdk_buffer_alloc_multi, + .buffer_free = dpdk_buffer_free, + .buffer_free_multi = dpdk_buffer_free_multi, + .buffer_from_event = dpdk_buffer_from_event, + .buffer_to_event = dpdk_buffer_to_event, + .buffer_addr = dpdk_buffer_addr, + .buffer_size = dpdk_buffer_size, + .buffer_is_valid = dpdk_buffer_is_valid, + .buffer_print = dpdk_buffer_print, + .buffer_to_u64 = dpdk_buffer_to_u64, + .buffer_pool = dpdk_buffer_pool, +}; + +ODP_MODULE_CONSTRUCTOR(dpdk_buffer) +{ + odp_module_constructor(&dpdk_buffer); + odp_subsystem_register_module(buffer, &dpdk_buffer); +} diff --git a/platform/linux-dpdk/pool/dpdk.c b/platform/linux-dpdk/pool/dpdk.c index 499bea127..6acc4e901 100644 --- a/platform/linux-dpdk/pool/dpdk.c +++ b/platform/linux-dpdk/pool/dpdk.c @@ -549,68 +549,6 @@ static odp_pool_t dpdk_pool_lookup(const char *name) return pool_hdl; } -static odp_buffer_t buffer_alloc(odp_pool_t pool_hdl) -{ - odp_buffer_t buffer; - pool_entry_cp_t *pool_cp; - pool_entry_dp_t *pool_dp; - - pool_cp = odp_pool_to_entry_cp(pool_hdl); - pool_dp = odp_pool_to_entry_dp(pool_hdl); - - ODP_ASSERT(pool_cp->params.type != ODP_POOL_BUFFER && - pool_cp->params.type != ODP_POOL_TIMEOUT); - - buffer = (odp_buffer_t)rte_ctrlmbuf_alloc(pool_dp->rte_mempool); - - if ((struct rte_mbuf *)buffer == NULL) { - rte_errno = ENOMEM; - return ODP_BUFFER_INVALID; - } - - buf_hdl_to_hdr(buffer)->next = NULL; - return buffer; -} - -odp_buffer_t odp_buffer_alloc(odp_pool_t pool_hdl) -{ - ODP_ASSERT(ODP_POOL_INVALID != pool_hdl); - - return buffer_alloc(pool_hdl); -} - -int odp_buffer_alloc_multi(odp_pool_t pool_hdl, odp_buffer_t buf[], int num) -{ - int i; - - ODP_ASSERT(ODP_POOL_INVALID != pool_hdl); - - for (i = 0; i < num; i++) { - buf[i] = buffer_alloc(pool_hdl); - if (buf[i] == ODP_BUFFER_INVALID) - return rte_errno == ENOMEM ? i : -EINVAL; - } - return i; -} - -void odp_buffer_free(odp_buffer_t buf) -{ - struct rte_mbuf *mbuf = (struct rte_mbuf *)buf; - - rte_ctrlmbuf_free(mbuf); -} - -void odp_buffer_free_multi(const odp_buffer_t buf[], int num) -{ - int i; - - for (i = 0; i < num; i++) { - struct rte_mbuf *mbuf = (struct rte_mbuf *)buf[i]; - - rte_ctrlmbuf_free(mbuf); - } -} - static void dpdk_pool_print(odp_pool_t pool_hdl) { pool_entry_dp_t *pool_dp = odp_pool_to_entry_dp(pool_hdl);