[dpdk-dev] [PATCH] mempool: don't leak ring on failure
Ananyev, Konstantin
konstantin.ananyev at intel.com
Tue Jun 24 18:16:02 CEST 2014
Hi Stephen,
>
> If mempool can not be created because of insufficient memory
> it returns an error but has already created a ring (and leaves it
> behind). This prevents code from trying one mempool size and then
> retrying with a smaller size if the bigger size fails.
>
> Reordering to do ring creation after getting memory fixes
> the problem.
>
But now, memzone created for the actual mempool could get leaked instead?
> Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
>
>
> --- a/lib/librte_mempool/rte_mempool.c 2014-06-24 08:20:28.513771717 -0700
> +++ b/lib/librte_mempool/rte_mempool.c 2014-06-24 08:20:28.513771717 -0700
> @@ -473,15 +473,6 @@ rte_mempool_xmem_create(const char *name
>
> rte_rwlock_write_lock(RTE_EAL_MEMPOOL_RWLOCK);
>
> - /* allocate the ring that will be used to store objects */
> - /* Ring functions will return appropriate errors if we are
> - * running as a secondary process etc., so no checks made
> - * in this function for that condition */
> - rte_snprintf(rg_name, sizeof(rg_name), RTE_MEMPOOL_MZ_FORMAT, name);
> - r = rte_ring_create(rg_name, rte_align32pow2(n+1), socket_id, rg_flags);
> - if (r == NULL)
> - goto exit;
> -
> /*
> * reserve a memory zone for this mempool: private data is
> * cache-aligned
> @@ -542,6 +533,15 @@ rte_mempool_xmem_create(const char *name
> startaddr = (void*)addr;
> }
>
> + /* allocate the ring that will be used to store objects */
> + /* Ring functions will return appropriate errors if we are
> + * running as a secondary process etc., so no checks made
> + * in this function for that condition */
> + rte_snprintf(rg_name, sizeof(rg_name), RTE_MEMPOOL_MZ_FORMAT, name);
> + r = rte_ring_create(rg_name, rte_align32pow2(n+1), socket_id, rg_flags);
> + if (r == NULL)
> + goto exit;
> +
> /* init the mempool structure */
> mp = startaddr;
> memset(mp, 0, sizeof(*mp));
More information about the dev
mailing list