mempool: ensure mempool is initialized before populating
authorArtem V. Andreev <artem.andreev@oktetlabs.ru>
Mon, 16 Apr 2018 13:24:32 +0000 (14:24 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 23 Apr 2018 23:41:01 +0000 (01:41 +0200)
Callback to calculate required memory area size may require mempool
driver data to be already allocated and initialized.

Signed-off-by: Artem V. Andreev <artem.andreev@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Acked-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
lib/librte_mempool/rte_mempool.c

index d9c09e1..b15b79b 100644 (file)
@@ -346,6 +346,21 @@ rte_mempool_free_memchunks(struct rte_mempool *mp)
        }
 }
 
+static int
+mempool_ops_alloc_once(struct rte_mempool *mp)
+{
+       int ret;
+
+       /* create the internal ring if not already done */
+       if ((mp->flags & MEMPOOL_F_POOL_CREATED) == 0) {
+               ret = rte_mempool_ops_alloc(mp);
+               if (ret != 0)
+                       return ret;
+               mp->flags |= MEMPOOL_F_POOL_CREATED;
+       }
+       return 0;
+}
+
 /* Add objects in the pool, using a physically contiguous memory
  * zone. Return the number of objects added, or a negative value
  * on error.
@@ -362,13 +377,9 @@ rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr,
        struct rte_mempool_memhdr *memhdr;
        int ret;
 
-       /* create the internal ring if not already done */
-       if ((mp->flags & MEMPOOL_F_POOL_CREATED) == 0) {
-               ret = rte_mempool_ops_alloc(mp);
-               if (ret != 0)
-                       return ret;
-               mp->flags |= MEMPOOL_F_POOL_CREATED;
-       }
+       ret = mempool_ops_alloc_once(mp);
+       if (ret != 0)
+               return ret;
 
        /* Notify memory area to mempool */
        ret = rte_mempool_ops_register_memory_area(mp, vaddr, iova, len);
@@ -570,6 +581,10 @@ rte_mempool_populate_default(struct rte_mempool *mp)
        int ret;
        bool force_contig, no_contig, try_contig, no_pageshift;
 
+       ret = mempool_ops_alloc_once(mp);
+       if (ret != 0)
+               return ret;
+
        /* mempool must not be populated */
        if (mp->nb_mem_chunks != 0)
                return -EEXIST;
@@ -774,6 +789,10 @@ rte_mempool_populate_anon(struct rte_mempool *mp)
                return 0;
        }
 
+       ret = mempool_ops_alloc_once(mp);
+       if (ret != 0)
+               return ret;
+
        /* get chunk of virtually continuous memory */
        size = get_anon_size(mp);
        addr = mmap(NULL, size, PROT_READ | PROT_WRITE,