mempool: ensure mempool is initialized before populating
[dpdk.git] / lib / librte_mempool / rte_mempool.c
index 9731d4c..b15b79b 100644 (file)
@@ -100,12 +100,12 @@ static unsigned optimize_object_size(unsigned obj_size)
 }
 
 static int
-find_min_pagesz(const struct rte_memseg *ms, void *arg)
+find_min_pagesz(const struct rte_memseg_list *msl, void *arg)
 {
        size_t *min = arg;
 
-       if (ms->hugepage_sz < *min)
-               *min = ms->hugepage_sz;
+       if (msl->page_sz < *min)
+               *min = msl->page_sz;
 
        return 0;
 }
@@ -115,11 +115,12 @@ get_min_page_size(void)
 {
        size_t min_pagesz = SIZE_MAX;
 
-       rte_memseg_walk(find_min_pagesz, &min_pagesz);
+       rte_memseg_list_walk(find_min_pagesz, &min_pagesz);
 
        return min_pagesz == SIZE_MAX ? (size_t) getpagesize() : min_pagesz;
 }
 
+
 static void
 mempool_add_elem(struct rte_mempool *mp, void *obj, rte_iova_t iova)
 {
@@ -345,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.
@@ -361,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);
@@ -420,12 +432,18 @@ rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr,
        }
 
        /* not enough room to store one object */
-       if (i == 0)
-               return -EINVAL;
+       if (i == 0) {
+               ret = -EINVAL;
+               goto fail;
+       }
 
        STAILQ_INSERT_TAIL(&mp->mem_list, memhdr, next);
        mp->nb_mem_chunks++;
        return i;
+
+fail:
+       rte_free(memhdr);
+       return ret;
 }
 
 int
@@ -452,7 +470,7 @@ rte_mempool_populate_iova_tab(struct rte_mempool *mp, char *vaddr,
        if (mp->nb_mem_chunks != 0)
                return -EEXIST;
 
-       if (mp->flags & MEMPOOL_F_NO_PHYS_CONTIG)
+       if (mp->flags & MEMPOOL_F_NO_IOVA_CONTIG)
                return rte_mempool_populate_iova(mp, vaddr, RTE_BAD_IOVA,
                        pg_num * pg_sz, free_cb, opaque);
 
@@ -506,7 +524,7 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr,
        if (RTE_ALIGN_CEIL(len, pg_sz) != len)
                return -EINVAL;
 
-       if (mp->flags & MEMPOOL_F_NO_PHYS_CONTIG)
+       if (mp->flags & MEMPOOL_F_NO_IOVA_CONTIG)
                return rte_mempool_populate_iova(mp, addr, RTE_BAD_IOVA,
                        len, free_cb, opaque);
 
@@ -563,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;
@@ -576,7 +598,7 @@ rte_mempool_populate_default(struct rte_mempool *mp)
        /* update mempool capabilities */
        mp->flags |= mp_flags;
 
-       no_contig = mp->flags & MEMPOOL_F_NO_PHYS_CONTIG;
+       no_contig = mp->flags & MEMPOOL_F_NO_IOVA_CONTIG;
        force_contig = mp->flags & MEMPOOL_F_CAPA_PHYS_CONTIG;
 
        /*
@@ -767,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,