[dpdk-dev] [PATCH v1 8/9] mempool: ensure the mempool is initialized before populating
Olivier Matz
olivier.matz at 6wind.com
Mon Mar 19 18:06:57 CET 2018
On Sat, Mar 10, 2018 at 03:39:41PM +0000, Andrew Rybchenko wrote:
> From: "Artem V. Andreev" <Artem.Andreev at oktetlabs.ru>
>
> 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 at oktetlabs.ru>
> Signed-off-by: Andrew Rybchenko <arybchenko at solarflare.com>
> ---
> RFCv2 -> v1:
> - rename helper function as mempool_ops_alloc_once()
>
> lib/librte_mempool/rte_mempool.c | 29 ++++++++++++++++++++++-------
> 1 file changed, 22 insertions(+), 7 deletions(-)
>
> diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c
> index 844d907..12085cd 100644
> --- a/lib/librte_mempool/rte_mempool.c
> +++ b/lib/librte_mempool/rte_mempool.c
> @@ -322,6 +322,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.
> @@ -336,13 +351,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;
>
> /* mempool is already populated */
> if (mp->populated_size >= mp->size)
> @@ -515,6 +526,10 @@ rte_mempool_populate_default(struct rte_mempool *mp)
> unsigned mz_id, n;
> int ret;
>
> + ret = mempool_ops_alloc_once(mp);
> + if (ret != 0)
> + return ret;
> +
> /* mempool must not be populated */
> if (mp->nb_mem_chunks != 0)
> return -EEXIST;
Is there a reason why we need to add it in
rte_mempool_populate_default() but not in rte_mempool_populate_virt() and
rte_mempool_populate_iova_tab()?
More information about the dev
mailing list