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 39BA62BA7 for ; Thu, 19 Jan 2017 05:40:28 +0100 (CET) Received: by mail-lf0-f42.google.com with SMTP id n124so27219554lfd.2 for ; Wed, 18 Jan 2017 20:40:28 -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=xPDwhOzKY0TF6hWiHBExUiLmhRawjVTBwTH8Q2psv1Y=; b=IKjuy08y+i0Zy/v28JM5l5tI5AyBqJDrP7pRHjLDHWZVsP13nW7AGotHGqq5tuoPfa DmBo0Wd1lZIPNx0qzNpcK1dV7RuSf35SvQ3F9XhgPSOT0ct5YAD4jQlK5iOocIYkHPWr g4g3FxNINWqkENKc0+6g1RLbNq5TcUYRBqvos= 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=xPDwhOzKY0TF6hWiHBExUiLmhRawjVTBwTH8Q2psv1Y=; b=R0SjE0MWwg42nTV5A3yWZHgU9RtGc+s2TOPqQQs742HHKdWKe9W/5SeBSTp7mIuc8H bEdijP37N4LVC5QMkLIWFCIkB4L09BstOgO1L7v9LnJ8M2baBrwfQhK9n9J4ijkKfeF0 EOIzRfZrelY0HPOHwUSAeKDLRkNdRltH/KjBuBlN1C4XVCTbL3Cx3RIh5zlIwPhgQv6w ya0Pk4xqBUC9n5JNztZoP8zE2NYeQy8BWkEWOAsJA9p+lGu29eRsJKyGpDnAeGDxXeS9 cLqXS4hdFcUWRAIU4Q3X0n4P6kP31TNK7h1GurQZs6IIy4UYzQaaLTF4zjABye3RuDUD rGhQ== X-Gm-Message-State: AIkVDXLLjMgTJ2XjrdQOmuCBuxBLn70IPJEeIJ1wlXhwqPvDpBDiXst+u3L2QlRf2db/GLen X-Received: by 10.25.137.193 with SMTP id l184mr1935455lfd.31.1484800827817; Wed, 18 Jan 2017 20:40:27 -0800 (PST) Received: from localhost.localdomain ([91.201.72.212]) by smtp.gmail.com with ESMTPSA id z1sm1114684lja.10.2017.01.18.20.40.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 18 Jan 2017 20:40:27 -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:14 +0700 Message-Id: <1484800814-983-3-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 2/2] 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: Thu, 19 Jan 2017 04:40:28 -0000 Optimized kni_allocate_mbufs and kni_free_mbufs by using mbuf bulk functions. This can improve performance more than two times. Signed-off-by: Sergey Vyazmitinov --- v5: * use rte_pktmbuf_free_bulk for removing packets which was not put in alloc queue. --- lib/librte_kni/rte_kni.c | 47 ++++++++++++++++++++----------------------- lib/librte_kni/rte_kni_fifo.h | 18 +++++++++++++++++ 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index a80cefd..3fad647 100644 --- a/lib/librte_kni/rte_kni.c +++ b/lib/librte_kni/rte_kni.c @@ -590,22 +590,21 @@ rte_kni_rx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned num) static void kni_free_mbufs(struct rte_kni *kni) { - int i, ret; + unsigned int freeing; struct rte_mbuf *pkts[MAX_MBUF_BURST_NUM]; - ret = kni_fifo_get(kni->free_q, (void **)pkts, MAX_MBUF_BURST_NUM); - if (likely(ret > 0)) { - for (i = 0; i < ret; i++) - rte_pktmbuf_free(pkts[i]); + freeing = kni_fifo_get(kni->free_q, (void **)pkts, MAX_MBUF_BURST_NUM); + if (likely(freeing > 0)) { + rte_pktmbuf_free_bulk(pkts, freeing); } } static void kni_allocate_mbufs(struct rte_kni *kni) { - int i, ret; - struct rte_mbuf *pkts[MAX_MBUF_BURST_NUM]; - void *phys[MAX_MBUF_BURST_NUM]; + unsigned int count, put; + struct rte_mbuf *pkts[KNI_FIFO_COUNT_MAX]; + void *phys[KNI_FIFO_COUNT_MAX]; RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pool) != offsetof(struct rte_kni_mbuf, pool)); @@ -628,28 +627,26 @@ kni_allocate_mbufs(struct rte_kni *kni) return; } - for (i = 0; i < MAX_MBUF_BURST_NUM; i++) { - pkts[i] = rte_pktmbuf_alloc(kni->pktmbuf_pool); - if (unlikely(pkts[i] == NULL)) { - /* Out of memory */ - RTE_LOG(ERR, KNI, "Out of memory\n"); - break; - } - phys[i] = va2pa(pkts[i]); - } + /* Calculate alloc queue free space */ + count = kni_fifo_free_count(kni->alloc_q); - /* No pkt mbuf alocated */ - if (i <= 0) + /* Get buffers from mempool */ + if (rte_pktmbuf_alloc_bulk(kni->pktmbuf_pool, pkts, count) != 0) { + RTE_LOG(ERR, KNI, "Can`t allocate %d mbufs\n", count); return; + } + + for (unsigned int i = 0; i < count; i++) + phys[i] = va2pa(pkts[i]); - ret = kni_fifo_put(kni->alloc_q, phys, i); + /* Put buffers into alloc queue */ + put = kni_fifo_put(kni->alloc_q, (void **)phys, count); /* Check if any mbufs not put into alloc_q, and then free them */ - if (ret >= 0 && ret < i && ret < MAX_MBUF_BURST_NUM) { - int j; - - for (j = ret; j < i; j++) - rte_pktmbuf_free(pkts[j]); + if (unlikely(put < count)) { + RTE_LOG(ERR, KNI, "Free %u of %u allocated buffers\n", + count - put, count); + rte_pktmbuf_free_bulk(pkts + put, count - put); } } diff --git a/lib/librte_kni/rte_kni_fifo.h b/lib/librte_kni/rte_kni_fifo.h index 8cb8587..361ddb0 100644 --- a/lib/librte_kni/rte_kni_fifo.h +++ b/lib/librte_kni/rte_kni_fifo.h @@ -91,3 +91,21 @@ kni_fifo_get(struct rte_kni_fifo *fifo, void **data, unsigned num) fifo->read = new_read; return i; } + +/** + * Get the num of elements in the fifo + */ +static inline unsigned +kni_fifo_count(struct rte_kni_fifo *fifo) +{ + return (fifo->len + fifo->write - fifo->read) & (fifo->len - 1); +} + +/** + * Get the num of available elements in the fifo + */ +static inline unsigned +kni_fifo_free_count(struct rte_kni_fifo *fifo) +{ + return (fifo->read - fifo->write - 1) & (fifo->len - 1); +} -- 2.7.4