From patchwork Wed Jan 9 11:31:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gavin Hu X-Patchwork-Id: 49525 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 286711B474; Wed, 9 Jan 2019 12:32:08 +0100 (CET) Received: from foss.arm.com (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by dpdk.org (Postfix) with ESMTP id 46BC31B439; Wed, 9 Jan 2019 12:32:05 +0100 (CET) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id AD30A1650; Wed, 9 Jan 2019 03:32:04 -0800 (PST) Received: from net-arm-c2400.shanghai.arm.com (net-arm-c2400.shanghai.arm.com [10.169.41.165]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 1F7323F70D; Wed, 9 Jan 2019 03:32:02 -0800 (PST) From: gavin hu To: dev@dpdk.org Cc: nd@arm.com, thomas@monjalon.net, jerinj@marvell.com, hemant.agrawal@nxp.com, Honnappa.Nagarahalli@arm.com, gavin.hu@arm.com, olivier.matz@6wind.com, bruce.richardson@intel.com, stable@dpdk.org Date: Wed, 9 Jan 2019 19:31:42 +0800 Message-Id: <1547033502-3167-4-git-send-email-gavin.hu@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1547033502-3167-1-git-send-email-gavin.hu@arm.com> References: <1547033502-3167-1-git-send-email-gavin.hu@arm.com> In-Reply-To: <1546483094-29712-2-git-send-email-gavin.hu@arm.com> References: <1546483094-29712-2-git-send-email-gavin.hu@arm.com> Subject: [dpdk-dev] [PATCH v6 3/3] hash: flush the rings instead of dequeuing one by one 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Gavin Hu Within rte_hash_reset, calling a while loop to dequeue one by one from the ring, while not using them at all, is wasting cycles, The patch just flush the ring by resetting the indices can save cpu cycles. Fixes: b26473ff8f4a ("hash: add reset function") Fixes: 75706568a7eb ("hash: add extendable bucket feature") Cc: stable@dpdk.org Signed-off-by: Gavin Hu Reviewed-by: Honnappa Nagarahalli Acked-by: Yipeng Wang --- lib/librte_hash/Makefile | 2 +- lib/librte_hash/meson.build | 3 +++ lib/librte_hash/rte_cuckoo_hash.c | 11 ++++------- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile index c8c435d..5669d83 100644 --- a/lib/librte_hash/Makefile +++ b/lib/librte_hash/Makefile @@ -6,7 +6,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # library name LIB = librte_hash.a -CFLAGS += -O3 +CFLAGS += -O3 -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) LDLIBS += -lrte_eal -lrte_ring diff --git a/lib/librte_hash/meson.build b/lib/librte_hash/meson.build index efc06ed..ebf70de 100644 --- a/lib/librte_hash/meson.build +++ b/lib/librte_hash/meson.build @@ -14,3 +14,6 @@ headers = files('rte_cmp_arm64.h', sources = files('rte_cuckoo_hash.c', 'rte_fbk_hash.c') deps += ['ring'] + +# rte ring reset is not yet part of stable API +allow_experimental_apis = true diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/librte_hash/rte_cuckoo_hash.c index c01489b..4b08049 100644 --- a/lib/librte_hash/rte_cuckoo_hash.c +++ b/lib/librte_hash/rte_cuckoo_hash.c @@ -559,7 +559,6 @@ __hash_rw_reader_unlock(const struct rte_hash *h) void rte_hash_reset(struct rte_hash *h) { - void *ptr; uint32_t tot_ring_cnt, i; if (h == NULL) @@ -570,16 +569,14 @@ rte_hash_reset(struct rte_hash *h) memset(h->key_store, 0, h->key_entry_size * (h->entries + 1)); *h->tbl_chng_cnt = 0; - /* clear the free ring */ - while (rte_ring_dequeue(h->free_slots, &ptr) == 0) - continue; + /* reset the free ring */ + rte_ring_reset(h->free_slots); - /* clear free extendable bucket ring and memory */ + /* flush free extendable bucket ring and memory */ if (h->ext_table_support) { memset(h->buckets_ext, 0, h->num_buckets * sizeof(struct rte_hash_bucket)); - while (rte_ring_dequeue(h->free_ext_bkts, &ptr) == 0) - continue; + rte_ring_reset(h->free_ext_bkts); } /* Repopulate the free slots ring. Entry zero is reserved for key misses */