[v6,3/3] hash: flush the rings instead of dequeuing one by one

Message ID 1547033502-3167-4-git-send-email-gavin.hu@arm.com
State Superseded, archived
Delegated to: Thomas Monjalon
Headers show
Series
  • ring test enhancement and new ring reset api and use it by hash
Related show

Checks

Context Check Description
ci/Intel-compilation success Compilation OK
ci/checkpatch success coding style OK

Commit Message

Gavin Hu Jan. 9, 2019, 11:31 a.m.
From: Gavin Hu <gavin.hu@arm.com>

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 <gavin.hu@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
---
 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(-)

Comments

Wang, Yipeng1 Jan. 9, 2019, 6:53 p.m. | #1
>-----Original Message-----
>From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of gavin hu
>Sent: Wednesday, January 9, 2019 3:32 AM
>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; Richardson, Bruce <bruce.richardson@intel.com>; stable@dpdk.org
>Subject: [dpdk-dev] [PATCH v6 3/3] hash: flush the rings instead of dequeuing one by one
>
>From: Gavin Hu <gavin.hu@arm.com>
>
>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
[Wang, Yipeng] I don't think it is a bug fix applicable to previous stable versions.
>
>Signed-off-by: Gavin Hu <gavin.hu@arm.com>
>Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>

[Wang, Yipeng] Otherwise the hash table change looks good to me and unit test passed on my setup.

Acked-by: Yipeng Wang <yipeng1.wang@intel.com>

Patch

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 */