From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f170.google.com (mail-wi0-f170.google.com [209.85.212.170]) by dpdk.org (Postfix) with ESMTP id AC8117EB0 for ; Tue, 31 Mar 2015 21:23:30 +0200 (CEST) Received: by wixo5 with SMTP id o5so14968963wix.1 for ; Tue, 31 Mar 2015 12:23:30 -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=J/iXZRynPE9OU97UHNPkoMF3vesxWewH0dipSLkR3VA=; b=OA+QFMoI8BlIeUbVbMvW5rLGyT2YeITz903/TOiMpV2UdqDa3gi6gJVVUmyJ4P9q22 Lwsz9g8/esFcqPspdOpAvNgeejwBhXBdIl2/nHDzVH6jXrsXnvDoJ4kNnJVbmoZTlhrh 96/MHokLWxNiezPiSD9+2EvwsDeyIaH1JHWpopEy9I691G3EyluI3DHhFyLk3SgQR/9D qUm7eG7ETq11VtYjwZpxboqaKMaXOQ5a7QlcPW6zUREnQMe9WEVla7s4MGUovIxJayRk vwfiFFHCEGzgSjnaejZ9jee6bkImEkpYFAVOQ0UgUV96sbmziI7h5QdGhUGklb7dg5qd AiCA== X-Gm-Message-State: ALoCoQkk8MUtV4lWrhkMZI2T0iI1wd2Pf2xZarQLINJlBGEedCrDID7sLlULpGGtKystbj6eXlhT X-Received: by 10.194.6.70 with SMTP id y6mr74926259wjy.97.1427829810579; Tue, 31 Mar 2015 12:23:30 -0700 (PDT) Received: from localhost.localdomain ([185.65.185.242]) by mx.google.com with ESMTPSA id g2sm25966892wib.1.2015.03.31.12.23.29 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 31 Mar 2015 12:23:29 -0700 (PDT) From: Olivier Matz X-Google-Original-From: Olivier Matz To: dev@dpdk.org Date: Tue, 31 Mar 2015 21:23:01 +0200 Message-Id: <1427829784-12323-3-git-send-email-zer0@droids-corp.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1427829784-12323-1-git-send-email-zer0@droids-corp.org> References: <1427385595-15011-1-git-send-email-olivier.matz@6wind.com> <1427829784-12323-1-git-send-email-zer0@droids-corp.org> Subject: [dpdk-dev] [PATCH v3 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: Tue, 31 Mar 2015 19:23:31 -0000 From: Olivier Matz 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 | 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 932fe58..ca6be88 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -725,44 +725,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->buf_physaddr = m->buf_physaddr; + mi->buf_addr = m->buf_addr; + mi->buf_len = m->buf_len; + mi->priv_size = m->priv_size; + + 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