[dpdk-dev,RFC,v2,11/17] mempool: ensure the mempool is initialized before populating
Checks
Commit Message
From: "Artem V. Andreev" <Artem.Andreev@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@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
lib/librte_mempool/rte_mempool.c | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
Comments
On Tue, Jan 23, 2018 at 01:16:06PM +0000, Andrew Rybchenko wrote:
> From: "Artem V. Andreev" <Artem.Andreev@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@oktetlabs.ru>
> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
> 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 fc9c95a..cbb4dd5 100644
> --- a/lib/librte_mempool/rte_mempool.c
> +++ b/lib/librte_mempool/rte_mempool.c
> @@ -370,6 +370,21 @@ rte_mempool_free_memchunks(struct rte_mempool *mp)
> }
> }
>
> +static int
> +mempool_maybe_initialize(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;
> +}
mempool_ops_alloc_once() ?
On 01/31/2018 07:45 PM, Olivier Matz wrote:
> On Tue, Jan 23, 2018 at 01:16:06PM +0000, Andrew Rybchenko wrote:
>> From: "Artem V. Andreev" <Artem.Andreev@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@oktetlabs.ru>
>> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
>> ---
>> 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 fc9c95a..cbb4dd5 100644
>> --- a/lib/librte_mempool/rte_mempool.c
>> +++ b/lib/librte_mempool/rte_mempool.c
>> @@ -370,6 +370,21 @@ rte_mempool_free_memchunks(struct rte_mempool *mp)
>> }
>> }
>>
>> +static int
>> +mempool_maybe_initialize(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;
>> +}
> mempool_ops_alloc_once() ?
Yes, I like it. Will fix.
@@ -370,6 +370,21 @@ rte_mempool_free_memchunks(struct rte_mempool *mp)
}
}
+static int
+mempool_maybe_initialize(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;
+}
+
int
rte_mempool_populate_one_by_one(struct rte_mempool *mp, unsigned int max_objs,
void *vaddr, rte_iova_t iova, size_t len,
@@ -408,13 +423,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_maybe_initialize(mp);
+ if (ret != 0)
+ return ret;
/* mempool is already populated */
if (mp->populated_size >= mp->size)
@@ -587,6 +598,10 @@ rte_mempool_populate_default(struct rte_mempool *mp)
unsigned mz_id, n;
int ret;
+ ret = mempool_maybe_initialize(mp);
+ if (ret != 0)
+ return ret;
+
/* mempool must not be populated */
if (mp->nb_mem_chunks != 0)
return -EEXIST;