New upstream version 17.11.4
[deb_dpdk.git] / lib / librte_hash / rte_cuckoo_hash.c
index cbf78fa..9be514d 100644 (file)
@@ -154,13 +154,13 @@ rte_hash_create(const struct rte_hash_parameters *params)
                 * except for the first cache
                 */
                num_key_slots = params->entries + (RTE_MAX_LCORE - 1) *
-                                       LCORE_CACHE_SIZE + 1;
+                                       (LCORE_CACHE_SIZE - 1) + 1;
        else
                num_key_slots = params->entries + 1;
 
        snprintf(ring_name, sizeof(ring_name), "HT_%s", params->name);
        /* Create ring (Dummy slot index is not enqueued) */
-       r = rte_ring_create(ring_name, rte_align32pow2(num_key_slots - 1),
+       r = rte_ring_create(ring_name, rte_align32pow2(num_key_slots),
                        params->socket_id, 0);
        if (r == NULL) {
                RTE_LOG(ERR, HASH, "memory allocation failed\n");
@@ -302,14 +302,17 @@ rte_hash_create(const struct rte_hash_parameters *params)
                        h->add_key = ADD_KEY_MULTIWRITER;
                        h->multiwriter_lock = rte_malloc(NULL,
                                                        sizeof(rte_spinlock_t),
-                                                       LCORE_CACHE_SIZE);
+                                                       RTE_CACHE_LINE_SIZE);
+                       if (h->multiwriter_lock == NULL)
+                               goto err_unlock;
+
                        rte_spinlock_init(h->multiwriter_lock);
                }
        } else
                h->add_key = ADD_KEY_SINGLEWRITER;
 
        /* Populate free slots ring. Entry zero is reserved for key misses. */
-       for (i = 1; i < params->entries + 1; i++)
+       for (i = 1; i < num_key_slots; i++)
                rte_ring_sp_enqueue(r, (void *)((uintptr_t) i));
 
        te->data = (void *) h;
@@ -391,7 +394,7 @@ void
 rte_hash_reset(struct rte_hash *h)
 {
        void *ptr;
-       unsigned i;
+       uint32_t tot_ring_cnt, i;
 
        if (h == NULL)
                return;
@@ -404,7 +407,13 @@ rte_hash_reset(struct rte_hash *h)
                rte_pause();
 
        /* Repopulate the free slots ring. Entry zero is reserved for key misses */
-       for (i = 1; i < h->entries + 1; i++)
+       if (h->hw_trans_mem_support)
+               tot_ring_cnt = h->entries + (RTE_MAX_LCORE - 1) *
+                                       (LCORE_CACHE_SIZE - 1);
+       else
+               tot_ring_cnt = h->entries;
+
+       for (i = 1; i < tot_ring_cnt + 1; i++)
                rte_ring_sp_enqueue(h->free_slots, (void *)((uintptr_t) i));
 
        if (h->hw_trans_mem_support) {