From mboxrd@z Thu Jan 1 00:00:00 1970 From: Olivier Matz Subject: Re: [PATCH v1 8/9] mempool: ensure the mempool is initialized before populating Date: Mon, 19 Mar 2018 18:06:57 +0100 Message-ID: <20180319170657.vjnaze5gwslcu2pi@platinum> References: <1516713372-10572-1-git-send-email-arybchenko@solarflare.com> <1520696382-16400-1-git-send-email-arybchenko@solarflare.com> <1520696382-16400-9-git-send-email-arybchenko@solarflare.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: dev@dpdk.org, "Artem V. Andreev" To: Andrew Rybchenko Return-path: Received: from mail.droids-corp.org (zoll.droids-corp.org [94.23.50.67]) by dpdk.org (Postfix) with ESMTP id C6DCB1B198 for ; Mon, 19 Mar 2018 18:07:04 +0100 (CET) Content-Disposition: inline In-Reply-To: <1520696382-16400-9-git-send-email-arybchenko@solarflare.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Sat, Mar 10, 2018 at 03:39:41PM +0000, Andrew Rybchenko wrote: > From: "Artem V. Andreev" > > Callback to calculate required memory area size may require mempool > driver data to be already allocated and initialized. > > Signed-off-by: Artem V. Andreev > Signed-off-by: Andrew Rybchenko > --- > 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()?