From: Zhike Wang Date: Tue, 14 Jul 2020 07:26:05 +0000 (+0800) Subject: mempool: fix allocation in memzone during retry X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=9dbe628a7ba2420d00bf8c15d066f9667092db2b;p=dpdk.git mempool: fix allocation in memzone during retry If allocation is successful on the first attempt, typically there is no problem since we allocated everything required and we'll terminate the loop (if memory chunk is really sufficient to populate required number of mempool elements). If the first attempt fails, we try to allocate half of mem_size and it succeed, we'll have one more iteration of the for-loop to allocate memory for remaining elements and should not try the next time with quarter of the mem_size. It is wrong that max_alloc_size is divided by 2 in the case of successful allocation as well, or invalid memory can be allocated, and leads to population failure, then errno other than ENOMEM may be returned. Fixes: 3a3d0c75b43e ("mempool: fix slow allocation of large pools") Cc: stable@dpdk.org Signed-off-by: Andrew Rybchenko Signed-off-by: Zhike Wang Acked-by: Anatoly Burakov --- diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index a2bd24984b..7774f0c8da 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -635,7 +635,7 @@ rte_mempool_populate_default(struct rte_mempool *mp) RTE_MIN((size_t)mem_size, max_alloc_size), mp->socket_id, mz_flags, align); - if (mz == NULL && rte_errno != ENOMEM) + if (mz != NULL || rte_errno != ENOMEM) break; max_alloc_size = RTE_MIN(max_alloc_size,