From a5f803c804c4f75ce7c736a143170c49bb7e72c9 Mon Sep 17 00:00:00 2001 From: Yunjian Wang Date: Wed, 22 Jul 2020 11:58:58 +0800 Subject: [PATCH] hash: fix out-of-memory handling in hash creation The function rte_zmalloc_socket() could return NULL, the return value need to be checked. Fixes: 5915699153d7 ("hash: fix scaling by reducing contention") Cc: stable@dpdk.org Reported-by: Bin Huang Signed-off-by: Yunjian Wang Reviewed-by: Honnappa Nagarahalli Acked-by: Yipeng Wang --- lib/librte_hash/rte_cuckoo_hash.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/librte_hash/rte_cuckoo_hash.c index 5f701d5792..0a6d474713 100644 --- a/lib/librte_hash/rte_cuckoo_hash.c +++ b/lib/librte_hash/rte_cuckoo_hash.c @@ -151,6 +151,7 @@ rte_hash_create(const struct rte_hash_parameters *params) unsigned int no_free_on_del = 0; uint32_t *ext_bkt_to_free = NULL; uint32_t *tbl_chng_cnt = NULL; + struct lcore_cache *local_free_slots = NULL; unsigned int readwrite_concur_lf_support = 0; uint32_t i; @@ -383,9 +384,13 @@ rte_hash_create(const struct rte_hash_parameters *params) #endif if (use_local_cache) { - h->local_free_slots = rte_zmalloc_socket(NULL, + local_free_slots = rte_zmalloc_socket(NULL, sizeof(struct lcore_cache) * RTE_MAX_LCORE, RTE_CACHE_LINE_SIZE, params->socket_id); + if (local_free_slots == NULL) { + RTE_LOG(ERR, HASH, "local free slots memory allocation failed\n"); + goto err_unlock; + } } /* Default hash function */ @@ -416,6 +421,7 @@ rte_hash_create(const struct rte_hash_parameters *params) *h->tbl_chng_cnt = 0; h->hw_trans_mem_support = hw_trans_mem_support; h->use_local_cache = use_local_cache; + h->local_free_slots = local_free_slots; h->readwrite_concur_support = readwrite_concur_support; h->ext_table_support = ext_table_support; h->writer_takes_lock = writer_takes_lock; @@ -461,6 +467,7 @@ err: rte_ring_free(r); rte_ring_free(r_ext); rte_free(te); + rte_free(local_free_slots); rte_free(h); rte_free(buckets); rte_free(buckets_ext); -- 2.20.1