From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f176.google.com (mail-wi0-f176.google.com [209.85.212.176]) by dpdk.org (Postfix) with ESMTP id 392B86942 for ; Wed, 25 Mar 2015 18:00:45 +0100 (CET) Received: by wibg7 with SMTP id g7so117175750wib.1 for ; Wed, 25 Mar 2015 10:00:45 -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=tNJFXEwpZ9RdVsbP3ry95pYUBBEnkVh8tRj+8dSERVQ=; b=aHQNi2G3mPD5nm+hItBg6MAa4RV0TuyP4AJZmOi/ik/RyI6Dbh9S+cWeNG+ABq9nCF M1gm0/KACeUc+z4azTBIq0MuDE77h+wYMnj3rv9T0lIRmMVTt+bBl2XOv5hWmBJ4/PvZ lmcYEgY4/mwTPkPcnIH8t1jk8dV4Ayr+uDvm4z4//SjV8RKdKkrkprp1WNI9D5LLwTsI TZTqD0Ksihw8uYk4QBTGnPuwOzGm9RrCGqNscB7gYq9CqtrdO2fXa7pUkaTv07N7azqt 2JajfHsxqp7xx4KYHfXtZvREWliAoealEdoBLLJwXpBfk7Ouhpy/8A+Ytteqd+tUYNDf dpbg== X-Gm-Message-State: ALoCoQlotvdUIUtRZx49N2Aqiprz5BcCArjJROueSOvMVkF5TvRm5N/nxIyDJ/sBr4OOyC/yqb9j X-Received: by 10.181.13.208 with SMTP id fa16mr3797881wid.22.1427302844732; Wed, 25 Mar 2015 10:00:44 -0700 (PDT) Received: from glumotte.dev.6wind.com (6wind.net2.nerim.net. [213.41.180.237]) by mx.google.com with ESMTPSA id wo10sm4513373wjb.35.2015.03.25.10.00.44 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 25 Mar 2015 10:00:44 -0700 (PDT) From: Olivier Matz To: dev@dpdk.org Date: Wed, 25 Mar 2015 18:00:35 +0100 Message-Id: <1427302838-8285-3-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1427302838-8285-1-git-send-email-olivier.matz@6wind.com> References: <1427302838-8285-1-git-send-email-olivier.matz@6wind.com> Subject: [dpdk-dev] [PATCH 2/5] 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, 25 Mar 2015 17:00:45 -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 --- lib/librte_mbuf/rte_mbuf.h | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index 4ced6d3..3dc12cb 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -714,44 +714,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_baddr(m, (char *)m->buf_addr); + 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->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->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