From patchwork Thu Mar 26 15:59:51 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olivier Matz X-Patchwork-Id: 4147 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 6CEEE6837; Thu, 26 Mar 2015 17:00:06 +0100 (CET) Received: from mail-wg0-f50.google.com (mail-wg0-f50.google.com [74.125.82.50]) by dpdk.org (Postfix) with ESMTP id 9B30F37A4 for ; Thu, 26 Mar 2015 17:00:02 +0100 (CET) Received: by wgbcc7 with SMTP id cc7so68693395wgb.0 for ; Thu, 26 Mar 2015 09:00:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=LMjcMxhk5GJI7muQ/8NlVwHMxXBG90+RE0wZEHrbG0w=; b=OZNvXPaikTrzXTH6hy4Ub6wLPFX/PXBqNrIYzHScv8XdIAPWzk6VWSOjEPAmYdPe7s +9LU570J1rQpLIiFS7Q+qB/hLYuJ8ao2CsI9wYxouJutFXsA3gKNOmofrXDIQykGQSJY 2Ur/3e3cR6fdlcn/uEFSjGSDXNHUkas1wOcM95mjGmjqMAbd6qQC+++oDjIr30+I0E+7 RkHtE3wJdl2MG+0qDNPfmh6bIMqXa9hZqbzMQeugxZ1gjVfVa9RpuwfyHMgWR7KCj2L5 KD+4t+SORZygAY9+3klB5J6ANI7S9IrkFFDJWnn/LbwDBFoxry4HYdtjP3IidUtWKMfH H0RQ== X-Gm-Message-State: ALoCoQlgDO23zIGNAwhJ6VbTnGeNSYj40Y1EqNs22EuUp4qt1s0a9QkoSvw671oKDJyo73+n9Rkb X-Received: by 10.194.185.68 with SMTP id fa4mr28650465wjc.111.1427385602401; Thu, 26 Mar 2015 09:00:02 -0700 (PDT) Received: from glumotte.dev.6wind.com (6wind.net2.nerim.net. [213.41.180.237]) by mx.google.com with ESMTPSA id i3sm2797619wiy.23.2015.03.26.09.00.01 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 26 Mar 2015 09:00:01 -0700 (PDT) From: Olivier Matz To: dev@dpdk.org Date: Thu, 26 Mar 2015 16:59:51 +0100 Message-Id: <1427385595-15011-2-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1427385595-15011-1-git-send-email-olivier.matz@6wind.com> References: <1427302838-8285-1-git-send-email-olivier.matz@6wind.com> <1427385595-15011-1-git-send-email-olivier.matz@6wind.com> Cc: zoltan.kiss@linaro.org Subject: [dpdk-dev] [PATCH v2 1/5] mbuf: fix clone support when application uses private mbuf data X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add a new private_size field in mbuf structure that should be initialized at mbuf pool creation. This field contains the size of the application private data in mbufs. Introduce new static inline functions rte_mbuf_from_indirect() and rte_mbuf_to_baddr() to replace the existing macros, which take the private size in account when attaching and detaching mbufs. Signed-off-by: Olivier Matz --- app/test-pmd/testpmd.c | 1 + examples/vhost/main.c | 2 +- lib/librte_mbuf/rte_mbuf.c | 1 + lib/librte_mbuf/rte_mbuf.h | 44 ++++++++++++++++++++++++++++++++++---------- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 3057791..c5a195a 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -425,6 +425,7 @@ testpmd_mbuf_ctor(struct rte_mempool *mp, mb->tx_offload = 0; mb->vlan_tci = 0; mb->hash.rss = 0; + mb->priv_size = 0; } static void diff --git a/examples/vhost/main.c b/examples/vhost/main.c index c3fcb80..d542461 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -139,7 +139,7 @@ /* Number of descriptors per cacheline. */ #define DESC_PER_CACHELINE (RTE_CACHE_LINE_SIZE / sizeof(struct vring_desc)) -#define MBUF_EXT_MEM(mb) (RTE_MBUF_FROM_BADDR((mb)->buf_addr) != (mb)) +#define MBUF_EXT_MEM(mb) (rte_mbuf_from_indirect(mb) != (mb)) /* mask of enabled ports */ static uint32_t enabled_port_mask = 0; diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c index 526b18d..e095999 100644 --- a/lib/librte_mbuf/rte_mbuf.c +++ b/lib/librte_mbuf/rte_mbuf.c @@ -125,6 +125,7 @@ rte_pktmbuf_init(struct rte_mempool *mp, m->pool = mp; m->nb_segs = 1; m->port = 0xff; + m->priv_size = 0; } /* do some sanity checks on a mbuf: panic if it fails */ diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index 17ba791..45ac948 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -317,18 +317,42 @@ struct rte_mbuf { /* uint64_t unused:8; */ }; }; + + uint16_t priv_size; /**< size of the application private data */ } __rte_cache_aligned; /** - * Given the buf_addr returns the pointer to corresponding mbuf. + * Return the mbuf owning the data buffer address of an indirect mbuf. + * + * @param mi + * The pointer to the indirect mbuf. + * @return + * The address of the direct mbuf corresponding to buffer_addr. */ -#define RTE_MBUF_FROM_BADDR(ba) (((struct rte_mbuf *)(ba)) - 1) +static inline struct rte_mbuf * +rte_mbuf_from_indirect(struct rte_mbuf *mi) +{ + struct rte_mbuf *md; + md = (struct rte_mbuf *)((char *)mi->buf_addr - sizeof(*mi) - + mi->priv_size); + return md; +} /** - * Given the pointer to mbuf returns an address where it's buf_addr - * should point to. + * Return the buffer address embedded in the given mbuf. + * + * @param md + * The pointer to the mbuf. + * @return + * The address of the data buffer owned by the mbuf. */ -#define RTE_MBUF_TO_BADDR(mb) (((struct rte_mbuf *)(mb)) + 1) +static inline char * +rte_mbuf_to_baddr(struct rte_mbuf *md) +{ + char *buffer_addr; + buffer_addr = (char *)md + sizeof(*md) + md->priv_size; + return buffer_addr; +} /** * Returns TRUE if given mbuf is indirect, or FALSE otherwise. @@ -744,12 +768,12 @@ static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *md) static inline void rte_pktmbuf_detach(struct rte_mbuf *m) { const struct rte_mempool *mp = m->pool; - void *buf = RTE_MBUF_TO_BADDR(m); - uint32_t buf_len = mp->elt_size - sizeof(*m); - m->buf_physaddr = rte_mempool_virt2phy(mp, m) + sizeof (*m); + void *buf = rte_mbuf_to_baddr(m); + unsigned mhdr_size = (char *)buf - (char *)m; + m->buf_physaddr = rte_mempool_virt2phy(mp, m) + mhdr_size; m->buf_addr = buf; - m->buf_len = (uint16_t)buf_len; + m->buf_len = (uint16_t)(mp->elt_size - mhdr_size); m->data_off = (RTE_PKTMBUF_HEADROOM <= m->buf_len) ? RTE_PKTMBUF_HEADROOM : m->buf_len; @@ -774,7 +798,7 @@ __rte_pktmbuf_prefree_seg(struct rte_mbuf *m) * - free attached mbuf segment */ if (RTE_MBUF_INDIRECT(m)) { - struct rte_mbuf *md = RTE_MBUF_FROM_BADDR(m->buf_addr); + struct rte_mbuf *md = rte_mbuf_from_indirect(m); rte_pktmbuf_detach(m); if (rte_mbuf_refcnt_update(md, -1) == 0) __rte_mbuf_raw_free(md);