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