hash: fix key slot size accuracy
This commit calculates the needed key slot size more accurately. The previous local cache fix requires the free slot ring to be larger than actually needed. The calculation of the value is inaccurate. Fixes: 5915699153d7 ("hash: fix scaling by reducing contention") Cc: stable@dpdk.org Signed-off-by: Yipeng Wang <yipeng1.wang@intel.com> Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
This commit is contained in:
parent
eb067d431d
commit
575a48c961
@ -125,13 +125,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");
|
||||
@ -290,7 +290,7 @@ rte_hash_create(const struct rte_hash_parameters *params)
|
||||
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;
|
||||
@ -372,7 +372,7 @@ void
|
||||
rte_hash_reset(struct rte_hash *h)
|
||||
{
|
||||
void *ptr;
|
||||
unsigned i;
|
||||
uint32_t tot_ring_cnt, i;
|
||||
|
||||
if (h == NULL)
|
||||
return;
|
||||
@ -385,7 +385,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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user