From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wj0-f176.google.com (mail-wj0-f176.google.com [209.85.210.176]) by dpdk.org (Postfix) with ESMTP id E60E5F60E for ; Wed, 11 Jan 2017 17:38:33 +0100 (CET) Received: by mail-wj0-f176.google.com with SMTP id ew7so93109537wjc.3 for ; Wed, 11 Jan 2017 08:38:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:date:to:cc:subject:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6xuJmVDaLcVqqlRDCuDHWm0ihiiR8J1CiukrX7qz9+o=; b=ngb/DfwN/IGKCW61m8kypLBLxkYnJnPl+3i7F89VoVSTH29z+UZcYqbDjkvnlVT9/4 AVSdX6Q715/s8jse3A346y2otbJL5SZ8hpTAfTHbUVrulZkoj71qBqSKoNzS9yQu+Cz3 IX3I+y+XhlqEE6RZbqHy/R4+n8K9PtNCqE9dffcbybnDB9j4g3LwVezIVhWGQZKLfp/F focHCVswbstHkL9Oik9tdBJDpDqaPL5lJWsOyCootoCdBSzUBcBiCt4FT3mxk6wo1XmG b94AjaQIndS9Ye2w6V7219hYUzZnmPN7oHiOChM0z0Z+GBzlxyah96km+xjBbX4Lny5I 0qMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6xuJmVDaLcVqqlRDCuDHWm0ihiiR8J1CiukrX7qz9+o=; b=tmTbAGUU+Lsyhx+pKvJpHSVkdJwMpC3M/KmtBxvj4EQtFfzp0WfuMB9B6dWqcDIsTH q1waucm3PlFCeFLTcCkYrM81u/WPWC+AhytxMIjvWjpQ0cKE4DPNcoF3gQqeaHZp4N2i TJrRbGvxZBGpTXUUUy1DqWSiorRBjQMXkygc6m4GnnkLStcuHAdVFy1FkfratQBKegCo Le0pODl0Le33hPhbQ7ZFneOnkZOXsAEwmi91kX5ceH7Wh97ZDhtCvYQBN91I+VLucKd3 +n6F4s2q+1jTboVdLokyC0O5DmVBVTm+GTK9Lm4ZHnPjkgMhJAtA3Stf1rlvhwI1lJET NW6Q== X-Gm-Message-State: AIkVDXIvL5WGMm38M0FgNz8K8T8PejKmgonMo+hM8UlHZ0+k9JInsrBWsKJRI9a+/xq5Xl7z X-Received: by 10.194.148.230 with SMTP id tv6mr5897886wjb.176.1484152713643; Wed, 11 Jan 2017 08:38:33 -0800 (PST) Received: from glumotte.dev.6wind.com (guy78-3-82-239-227-177.fbx.proxad.net. [82.239.227.177]) by smtp.gmail.com with ESMTPSA id wp2sm9322051wjc.35.2017.01.11.08.38.33 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 11 Jan 2017 08:38:33 -0800 (PST) From: Olivier MATZ X-Google-Original-From: Olivier MATZ Date: Wed, 11 Jan 2017 17:38:25 +0100 To: Stephen Hemminger Cc: Sergey Vyazmitinov , olivier.matz@6wind.com, ferruh.yigit@intel.com, dev@dpdk.org Message-ID: <20170111173825.7caecf62@glumotte.dev.6wind.com> In-Reply-To: <20170111081759.7b1ee146@xeon-e3> References: <1483048216-2936-1-git-send-email-s.vyazmitinov@brain4net.com> <20170111081759.7b1ee146@xeon-e3> X-Mailer: Claws Mail 3.14.1 (GTK+ 2.24.30; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [dpdk-dev] [PATCH] kni: use bulk functions to allocate and free mbufs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Jan 2017 16:38:34 -0000 On Wed, 11 Jan 2017 08:17:59 -0800, Stephen Hemminger wrote: > On Fri, 30 Dec 2016 04:50:16 +0700 > Sergey Vyazmitinov wrote: > > > /** > > + * Free n packets mbuf back into its original mempool. > > + * > > + * Free each mbuf, and all its segments in case of chained > > buffers. Each > > + * segment is added back into its original mempool. > > + * > > + * @param mp > > + * The packets mempool. > > + * @param mbufs > > + * The packets mbufs array to be freed. > > + * @param n > > + * Number of packets. > > + */ > > +static inline void rte_pktmbuf_free_bulk(struct rte_mempool *mp, > > + struct rte_mbuf **mbufs, unsigned n) > > +{ > > + struct rte_mbuf *mbuf, *m_next; > > + unsigned i; > > + for (i = 0; i < n; ++i) { > > + mbuf = mbufs[i]; > > + __rte_mbuf_sanity_check(mbuf, 1); > > + > > + mbuf = mbuf->next; > > + while (mbuf != NULL) { > > + m_next = mbuf->next; > > + rte_pktmbuf_free_seg(mbuf); > > + mbuf = m_next; > > + } > > + } > > + rte_mempool_put_bulk(mp, (void * const *)mbufs, n); > > +} > > The mbufs may come from different pools. You need to handle that. I have an implementation for that in an endless-work-in-progress patchset: /** + * Free several mbufs segments. + * + * This function frees a table of mbufs, ensuring that each mbuf is + * returned into its original pool. It is the equivalent of calling + * rte_pktmbuf_free_seg() on all mbuf of the table. + * + * @param mbufs + * Array of mbuf pointers. + * @param n + * Array size. + */ +static inline void +rte_pktmbuf_free_seg_bulk(struct rte_mbuf * const *m_tab, unsigned n) +{ + struct rte_mbuf *m; + struct rte_mbuf * const *start = NULL; + unsigned n_free = 0, i; + struct rte_mempool *free_pool = NULL; + + for (i = 0; i < n; i++) { + m = m_tab[i]; + + if (__rte_pktmbuf_prefree_seg(m) == NULL) { + if (n_free != 0) + rte_mempool_put_bulk(free_pool, + (void * const *)start, n_free); + + free_pool = NULL; + n_free = 0; + continue; + } + + if (unlikely(m->pool != free_pool)) { + if (n_free != 0) + rte_mempool_put_bulk(free_pool, + (void * const *)start, n_free); + + free_pool = m->pool; + start = &m_tab[i]; + n_free = 1; + } else { + n_free++; + } + } + + if (n_free != 0) + rte_mempool_put_bulk(free_pool, + (void * const *)start, n_free); +} In the same patch, I also remove the tx_free_bulk_mbuf() functions that does almost the same job in specific drivers. Unfortunately, this patch needs to be rebased and better tested, so it's not ready yet. Regards, Olivier