From mboxrd@z Thu Jan 1 00:00:00 1970 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) Received: from lfbn-lil-1-702-109.w81-254.abo.wanadoo.fr ([81.254.39.109] helo=droids-corp.org) by mail.droids-corp.org with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1exyFu-00074a-39; Mon, 19 Mar 2018 18:07:35 +0100 Received: by droids-corp.org (sSMTP sendmail emulation); Mon, 19 Mar 2018 18:06:57 +0100 Date: Mon, 19 Mar 2018 18:06:57 +0100 From: Olivier Matz To: Andrew Rybchenko Cc: dev@dpdk.org, "Artem V. Andreev" 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 Content-Disposition: inline In-Reply-To: <1520696382-16400-9-git-send-email-arybchenko@solarflare.com> User-Agent: NeoMutt/20170113 (1.7.2) Subject: Re: [dpdk-dev] [PATCH v1 8/9] mempool: ensure the mempool is initialized before populating X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 19 Mar 2018 17:07:04 -0000 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()?