From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f179.google.com (mail-wi0-f179.google.com [209.85.212.179]) by dpdk.org (Postfix) with ESMTP id 63612C38E for ; Mon, 20 Apr 2015 17:41:55 +0200 (CEST) Received: by wiax7 with SMTP id x7so86617566wia.0 for ; Mon, 20 Apr 2015 08:41:55 -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=i9mHzkO5p+/l5gOV12vmQK/6/TOkjr6fFwyoncmSRJ0=; b=kxla6lq87Vmg8vdNLUX4HOSBHbuUALP3ucVhJh509bny3EFuqcSZwgAPyhkd4v3WMG 4WO2qTA+3fikP8IcifzH1q9y1ys6JE7Qj3mAyD6LrItYVoAFk3GmW0coY7xO0TcRfbA2 veYPtWPQ/fsnbO/QssjaN/j+yK8hT7QhZlwEpH7TiJSc5YD79E35fdC0DDZSzpkISgph P8HPeyDPlKO2cgNub1z5OTwohdRfPVa1zc6TwmgsQVOxnggDU8F4+1nfWYCvi1dXUbq0 31juuM8s1HfIFMBmYnOyxrHLwZHgfru30JAG79rrZDAVBx4008U7i0/w6cXoUn7XfVQK AG1Q== X-Gm-Message-State: ALoCoQkEdLHQK1j27gDMFNyCyolznhLJNk7LgPSG+0/2kBTpi4ZcqGghyUkgaGF6nFiE4P0HOwr1 X-Received: by 10.181.28.170 with SMTP id jp10mr26375049wid.25.1429544515284; Mon, 20 Apr 2015 08:41:55 -0700 (PDT) Received: from glumotte.dev.6wind.com (6wind.net2.nerim.net. [213.41.180.237]) by mx.google.com with ESMTPSA id fm8sm11258951wib.9.2015.04.20.08.41.54 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 20 Apr 2015 08:41:54 -0700 (PDT) From: Olivier Matz To: dev@dpdk.org Date: Mon, 20 Apr 2015 17:41:33 +0200 Message-Id: <1429544496-22532-10-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1429544496-22532-1-git-send-email-olivier.matz@6wind.com> References: <1427829784-12323-2-git-send-email-zer0@droids-corp.org> <1429544496-22532-1-git-send-email-olivier.matz@6wind.com> Subject: [dpdk-dev] [PATCH v4 09/12] 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: Mon, 20 Apr 2015 15:41:56 -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 5c01c5b..df54a46 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -799,43 +799,49 @@ 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->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