This patch fixes 2 bugs-
1] Incorrect position returned to the free slots.
2] Incorrect computation of total_entries

Bugzilla ID: 261
Fixes: 9d033dac7d7c ("hash: support no free on delete")
Cc: honnappa.nagaraha...@arm.com
Cc: sta...@dpdk.org

Reported-by: Linfan <zhongdahulin...@163.com>
Suggested-by: Linfan <zhongdahulin...@163.com>
Signed-off-by: Dharmik Thakkar <dharmik.thak...@arm.com>
---
 lib/librte_hash/rte_cuckoo_hash.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/lib/librte_hash/rte_cuckoo_hash.c 
b/lib/librte_hash/rte_cuckoo_hash.c
index 261267b7fd3d..ed2e96b6f178 100644
--- a/lib/librte_hash/rte_cuckoo_hash.c
+++ b/lib/librte_hash/rte_cuckoo_hash.c
@@ -1587,14 +1587,19 @@ int __rte_experimental
 rte_hash_free_key_with_position(const struct rte_hash *h,
                                const int32_t position)
 {
-       RETURN_IF_TRUE(((h == NULL) || (position == EMPTY_SLOT)), -EINVAL);
+       /*  Key index where key is stored, adding the first dummy index*/
+       uint32_t key_idx = position + 1;
+
+       RETURN_IF_TRUE(((h == NULL) || (key_idx == EMPTY_SLOT)), -EINVAL);
 
        unsigned int lcore_id, n_slots;
        struct lcore_cache *cached_free_slots;
-       const int32_t total_entries = h->num_buckets * RTE_HASH_BUCKET_ENTRIES;
+       const uint32_t total_entries = h->use_local_cache ?
+               h->entries + (RTE_MAX_LCORE - 1) * (LCORE_CACHE_SIZE - 1) + 1
+                                                       : h->entries + 1;
 
        /* Out of bounds */
-       if (position >= total_entries)
+       if (key_idx >= total_entries)
                return -EINVAL;
        if (h->ext_table_support && h->readwrite_concur_lf_support) {
                uint32_t index = h->ext_bkt_to_free[position];
@@ -1619,11 +1624,11 @@ rte_hash_free_key_with_position(const struct rte_hash 
*h,
                }
                /* Put index of new free slot in cache. */
                cached_free_slots->objs[cached_free_slots->len] =
-                                       (void *)((uintptr_t)position);
+                                       (void *)((uintptr_t)key_idx);
                cached_free_slots->len++;
        } else {
                rte_ring_sp_enqueue(h->free_slots,
-                               (void *)((uintptr_t)position));
+                               (void *)((uintptr_t)key_idx));
        }
 
        return 0;
-- 
2.17.1

Reply via email to