hash: flush rings instead of dequeuing one by one

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.

Signed-off-by: Gavin Hu <gavin.hu@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Acked-by: Yipeng Wang <yipeng1.wang@intel.com>
This commit is contained in:
Gavin Hu 2019-07-17 03:23:56 +08:00 committed by Thomas Monjalon
parent 272d87b01b
commit be0330cb1b
3 changed files with 8 additions and 8 deletions

@ -6,7 +6,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
# library name # library name
LIB = librte_hash.a LIB = librte_hash.a
CFLAGS += -O3 CFLAGS += -O3 -DALLOW_EXPERIMENTAL_API
CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
LDLIBS += -lrte_eal -lrte_ring LDLIBS += -lrte_eal -lrte_ring

@ -14,3 +14,6 @@ headers = files('rte_cmp_arm64.h',
sources = files('rte_cuckoo_hash.c', 'rte_fbk_hash.c') sources = files('rte_cuckoo_hash.c', 'rte_fbk_hash.c')
deps += ['ring'] deps += ['ring']
# rte ring reset is not yet part of stable API
allow_experimental_apis = true

@ -570,7 +570,6 @@ __hash_rw_reader_unlock(const struct rte_hash *h)
void void
rte_hash_reset(struct rte_hash *h) rte_hash_reset(struct rte_hash *h)
{ {
void *ptr;
uint32_t tot_ring_cnt, i; uint32_t tot_ring_cnt, i;
if (h == NULL) if (h == NULL)
@ -581,16 +580,14 @@ rte_hash_reset(struct rte_hash *h)
memset(h->key_store, 0, h->key_entry_size * (h->entries + 1)); memset(h->key_store, 0, h->key_entry_size * (h->entries + 1));
*h->tbl_chng_cnt = 0; *h->tbl_chng_cnt = 0;
/* clear the free ring */ /* reset the free ring */
while (rte_ring_dequeue(h->free_slots, &ptr) == 0) rte_ring_reset(h->free_slots);
continue;
/* clear free extendable bucket ring and memory */ /* flush free extendable bucket ring and memory */
if (h->ext_table_support) { if (h->ext_table_support) {
memset(h->buckets_ext, 0, h->num_buckets * memset(h->buckets_ext, 0, h->num_buckets *
sizeof(struct rte_hash_bucket)); sizeof(struct rte_hash_bucket));
while (rte_ring_dequeue(h->free_ext_bkts, &ptr) == 0) rte_ring_reset(h->free_ext_bkts);
continue;
} }
/* Repopulate the free slots ring. Entry zero is reserved for key misses */ /* Repopulate the free slots ring. Entry zero is reserved for key misses */