From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f175.google.com (mail-wi0-f175.google.com [209.85.212.175]) by dpdk.org (Postfix) with ESMTP id D9069C392 for ; Wed, 22 Apr 2015 11:57:52 +0200 (CEST) Received: by wizk4 with SMTP id k4so171117957wiz.1 for ; Wed, 22 Apr 2015 02:57:52 -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=o8tSM0htlnpwMMJYV9FPw2Ocacxqfj/Jok1ZD2VyGUc=; b=PYH/wj/QSsUVmWZN4fipQqcQUTPMA8xHNLW49BpsHvUkDNbw21ObHdnGjRpxdDu1X6 SWiPY79AykBfUlu+kccU//kkVNrm7CqqfNhSd8Q5sFE9iYPkZK9MzJ10wHtI4aM5UqqW 1owEl+9ML376l4I2Y2tXzDYUxVoMUmrCl5hJxV42IrPNd+86hCeXpj1cbmYwGsSDuX83 5Y+YdTsrPI4ZtjgzEhrdJVav1pRmrisbeRntOG1+i0NMEM3/aDC+Xsxvv3BuGHnYiA3g nWJjhuWdJ6uGnHLTiudYZOaTon1io2F4/lM+E4rVp3yIc9nIwNWeRxI1BaLDSdw1/01i yQzg== X-Gm-Message-State: ALoCoQkPGfvjWYUxHqpEi8IVEgCRrRCIy1KclO7Bj88GkUkHrE61qdOVmyovqb99lLWDeTe7Sni3 X-Received: by 10.194.158.193 with SMTP id ww1mr50397965wjb.100.1429696672786; Wed, 22 Apr 2015 02:57:52 -0700 (PDT) Received: from glumotte.dev.6wind.com (6wind.net2.nerim.net. [213.41.180.237]) by mx.google.com with ESMTPSA id yr1sm6570006wjc.37.2015.04.22.02.57.51 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 22 Apr 2015 02:57:52 -0700 (PDT) From: Olivier Matz To: dev@dpdk.org Date: Wed, 22 Apr 2015 11:57:26 +0200 Message-Id: <1429696650-9043-10-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1429696650-9043-1-git-send-email-olivier.matz@6wind.com> References: <1429610122-30943-1-git-send-email-olivier.matz@6wind.com> <1429696650-9043-1-git-send-email-olivier.matz@6wind.com> Subject: [dpdk-dev] [PATCH v6 09/13] mbuf: allow to clone an indirect mbuf 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: , X-List-Received-Date: Wed, 22 Apr 2015 09:57:53 -0000 Remove one limitation of rte_pktmbuf_attach(): "mbuf we're attaching to must be direct". Now, when we attach to an indirect mbuf: - copy the all relevant fields (addr, len, offload, ...) as before - get the pointer to the mbuf that embeds the data buffer (direct mbuf), and increase the reference counter of this one. When detaching the mbuf, we can retrieve this direct mbuf as the pointer is determined from the buffer address. Signed-off-by: Olivier Matz Acked-by: Neil Horman --- lib/librte_mbuf/rte_mbuf.h | 48 ++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index 17d39ae..70b0987 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -806,44 +806,50 @@ static inline struct rte_mbuf *rte_pktmbuf_alloc(struct rte_mempool *mp) * After attachment we refer the mbuf we attached as 'indirect', * while mbuf we attached to as 'direct'. * Right now, not supported: - * - attachment to indirect mbuf (e.g. - md has to be direct). * - attachment for already indirect mbuf (e.g. - mi has to be direct). * - mbuf we trying to attach (mi) is used by someone else * e.g. it's reference counter is greater then 1. * * @param mi * The indirect packet mbuf. - * @param md - * The direct packet mbuf. + * @param m + * The packet mbuf we're attaching to. */ -static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *md) +static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *m) { - RTE_MBUF_ASSERT(RTE_MBUF_DIRECT(md) && - RTE_MBUF_DIRECT(mi) && + struct rte_mbuf *md; + + RTE_MBUF_ASSERT(RTE_MBUF_DIRECT(mi) && rte_mbuf_refcnt_read(mi) == 1); + /* if m is not direct, get the mbuf that embeds the data */ + if (RTE_MBUF_DIRECT(m)) + md = m; + else + md = rte_mbuf_from_indirect(m); + rte_mbuf_refcnt_update(md, 1); - mi->buf_physaddr = md->buf_physaddr; - mi->buf_addr = md->buf_addr; - mi->buf_len = md->buf_len; - mi->priv_size = md->priv_size; - - mi->next = md->next; - mi->data_off = md->data_off; - mi->data_len = md->data_len; - mi->port = md->port; - mi->vlan_tci = md->vlan_tci; - mi->tx_offload = md->tx_offload; - mi->hash = md->hash; + mi->priv_size = m->priv_size; + mi->buf_physaddr = m->buf_physaddr; + mi->buf_addr = m->buf_addr; + mi->buf_len = m->buf_len; + + mi->next = m->next; + mi->data_off = m->data_off; + mi->data_len = m->data_len; + mi->port = m->port; + mi->vlan_tci = m->vlan_tci; + mi->tx_offload = m->tx_offload; + mi->hash = m->hash; mi->next = NULL; mi->pkt_len = mi->data_len; mi->nb_segs = 1; - mi->ol_flags = md->ol_flags | IND_ATTACHED_MBUF; - mi->packet_type = md->packet_type; + mi->ol_flags = m->ol_flags | IND_ATTACHED_MBUF; + mi->packet_type = m->packet_type; __rte_mbuf_sanity_check(mi, 1); - __rte_mbuf_sanity_check(md, 0); + __rte_mbuf_sanity_check(m, 0); } /** -- 2.1.4