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));