[dpdk-dev] [RFC PATCH 4/6] mempool: add a function to flush default cache

Andrew Rybchenko arybchenko at solarflare.com
Wed Jan 17 16:07:00 CET 2018


On 12/14/2017 04:38 PM, Olivier MATZ wrote:
> On Fri, Nov 24, 2017 at 04:06:29PM +0000, Andrew Rybchenko wrote:
>> From: "Artem V. Andreev" <Artem.Andreev at oktetlabs.ru>
>>
>> Mempool get/put API cares about cache itself, but sometimes it is
>> required to flush the cache explicitly.
> I don't disagree, but do you have some use-case in mind?

Ideally mempool objects should be reused ASAP. Block/bucket dequeue
bypasses cache, since cache is not block-aware. So, cache should be
flushed before block dequeue. Initially we had cache flush inside block
dequeue wrapper, but decoupling it gives more freedom for optimizations.

>> Also dedicated API allows to decouple it from block get API (to be
>> added) and provides more fine-grained control.
>>
>> Signed-off-by: Artem V. Andreev <Artem.Andreev at oktetlabs.ru>
>> Signed-off-by: Andrew Rybchenko <arybchenko at solarflare.com>
>> ---
>>   lib/librte_mempool/rte_mempool.h | 16 ++++++++++++++++
>>   1 file changed, 16 insertions(+)
>>
>> diff --git a/lib/librte_mempool/rte_mempool.h b/lib/librte_mempool/rte_mempool.h
>> index 9bcb8b7..3a52b93 100644
>> --- a/lib/librte_mempool/rte_mempool.h
>> +++ b/lib/librte_mempool/rte_mempool.h
>> @@ -1161,6 +1161,22 @@ rte_mempool_default_cache(struct rte_mempool *mp, unsigned lcore_id)
>>   }
>>   
>>   /**
>> + * Ensure that a default per-lcore mempool cache is flushed, if it is present
>> + *
>> + * @param mp
>> + *   A pointer to the mempool structure.
>> + */
>> +static __rte_always_inline void
>> +rte_mempool_ensure_cache_flushed(struct rte_mempool *mp)
>> +{
>> +	struct rte_mempool_cache *cache;
>> +	cache = rte_mempool_default_cache(mp, rte_lcore_id());
>> +	if (cache != NULL && cache->len > 0)
>> +		rte_mempool_cache_flush(cache, mp);
>> +}
>> +
> We already have rte_mempool_cache_flush().
> Why not just extending it instead of adding a new function?
>
> I mean:
>
>      static __rte_always_inline void
>      rte_mempool_cache_flush(struct rte_mempool_cache *cache,
>      			struct rte_mempool *mp)
>      {
>     +	if (cache == NULL)
>     +		cache = rte_mempool_default_cache(mp, rte_lcore_id());
>     +	if (cache == NULL || cache->len == 0)
>     +		return;
>      	rte_mempool_ops_enqueue_bulk(mp, cache->objs, cache->len);
>      	cache->len = 0;
>      }

Thanks, good idea.


More information about the dev mailing list