From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf0-f42.google.com (mail-lf0-f42.google.com [209.85.215.42]) by dpdk.org (Postfix) with ESMTP id 5ABB42BA7 for ; Thu, 19 Jan 2017 05:40:26 +0100 (CET) Received: by mail-lf0-f42.google.com with SMTP id k86so27228382lfi.0 for ; Wed, 18 Jan 2017 20:40:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brain4net.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=0QBLvXoHH76njj9gtnkTjbvj5mnqPNYR9nStJFaduY8=; b=RFgd8E67tdaOzgz5usQwV9jxMP8zBLJM+y4wY3sTXHmTreUFprjwW50eDo8YU5ak+n 6ZTTmZzJSizWrg+J0UFSo5qEDUAOqOh6ymSgT6gf1LUeHKob6keVwAw7q1Cps/RBF0te Fxwau5yag3qyBxnNZGLl53nlo8oVmHmyR8mRM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=0QBLvXoHH76njj9gtnkTjbvj5mnqPNYR9nStJFaduY8=; b=dnBYMV2hgth1w02R8Fivpj9QGJegOwRNfAEjj78J64RUKPoTTqkLJdlJUMEt/WiGWr ZftgwfkQZzgvJXgRaeSCWly3rOLo6SAFrAZQHoxs6ryk3/nkuzL5639pSerR2nvBa2Xr ajnb0yl1shW1JG18PypHSsrTeFIPuvASIcdC1JE/Fl67XlqfBOBv38DBSTLHYYnqQBvr d6YSOfU+CGsrNwCfAmv/c+bW6NBdHh1id/tY+cWGgDwFdKGCKSEziilP8ik3Tc8z6RQx 3V5jmJzz7q3U/rabTHstu0ybTL1EoWUKZMLi9ORZIvMi4htxi8fN5lZsP3wrv4uaHj+Y 0grg== X-Gm-Message-State: AIkVDXJiRy8QCtmq1qhFxPL1NlgUxNa3L2mZqDFG1WrFTef5nLyN1z3Djd5ZvYFNkqgWGqe+ X-Received: by 10.25.156.213 with SMTP id f204mr2303151lfe.27.1484800825787; Wed, 18 Jan 2017 20:40:25 -0800 (PST) Received: from localhost.localdomain ([91.201.72.212]) by smtp.gmail.com with ESMTPSA id z1sm1114684lja.10.2017.01.18.20.40.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 18 Jan 2017 20:40:25 -0800 (PST) From: Sergey Vyazmitinov To: olivier.matz@6wind.com Cc: konstantin.ananyev@intel.com, stephen@networkplumber.org, yuanhan.liu@linux.intel.com, ferruh.yigit@intel.com, dev@dpdk.org, mirqus@gmail.com, Sergey Vyazmitinov Date: Thu, 19 Jan 2017 11:40:13 +0700 Message-Id: <1484800814-983-2-git-send-email-s.vyazmitinov@brain4net.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1484800814-983-1-git-send-email-s.vyazmitinov@brain4net.com> References: <1484800814-983-1-git-send-email-s.vyazmitinov@brain4net.com> Subject: [dpdk-dev] [PATCH v5 1/2] kni: add bulk function to 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: Thu, 19 Jan 2017 04:40:26 -0000 Suggested-by: Stephen Hemminger Signed-off-by: Sergey Vyazmitinov --- v3: * Fixed issue with possible different mempools in buffer list. * Fixed issue with wrong rte_pktmbuf_alloc_bulk function return value processing in the kni_allocate_mbufs. --- lib/librte_mbuf/rte_mbuf.h | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index 4476d75..69d314f 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -306,6 +306,9 @@ extern "C" { /** Alignment constraint of mbuf private area. */ #define RTE_MBUF_PRIV_ALIGN 8 +/** Maximum number of mbufs freed in bulk. */ +#define RTE_MBUF_BULK_FREE 64 + /** * Get the name of a RX offload flag * @@ -1261,6 +1264,52 @@ static inline void rte_pktmbuf_free(struct rte_mbuf *m) } /** + * 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_mbuf **mbufs, + unsigned int n) +{ + void *tofree[RTE_MBUF_BULK_FREE]; + struct rte_mempool *mp = NULL; + unsigned int i, count = 0; + + for (i = 0; i < n; i++) { + struct rte_mbuf *m, *m_next; + + for (m = mbufs[i]; m; m = m_next) { + m_next = m->next; + + if (count > 0 && + (unlikely(m->pool != mp || + count == RTE_MBUF_BULK_FREE))) { + rte_mempool_put_bulk(mp, tofree, count); + count = 0; + } + + mp = m->pool; + + if (likely(__rte_pktmbuf_prefree_seg(m) != NULL)) { + m->next = NULL; + tofree[count++] = m; + } + } + } + + if (likely(count > 0)) + rte_mempool_put_bulk(mp, tofree, count); +} + +/** * Creates a "clone" of the given packet mbuf. * * Walks through all segments of the given packet mbuf, and for each of them: -- 2.7.4