> -----Original Message-----
> From: Olivier Matz [mailto:olivier.m...@6wind.com]
> Sent: Wednesday, October 16, 2019 9:23 AM
> 
> Hi Morten,
> 
> On Fri, Oct 11, 2019 at 01:24:00PM +0200, Morten Brørup wrote:
> > The rte_mempool_get_bulk() documentation says:
> >
> > "If cache is enabled, objects will be retrieved first from cache,
> subsequently from the common pool."
> >
> > But __mempool_generic_get() only uses the cache if the request is
> smaller than the cache size. If not, objects will be retrieved from the
> common pool only.
> >
> > Either the documentation should be corrected, or the implementation
> should behave as described, i.e. retrieve the first of the objects from
> the cache and the remaining objects from the common pool.
> 
> That's correct. I think the documentation could be updated.
> Maybe something like this:
> 
>  * If cache is enabled, objects will be retrieved first from cache,
>  * subsequently from the common pool. If the number of requested
> objects
>  * is higher than the cache size, the objects are directly retrieved
>  * from the common pool.
> 

Agreed.

> The put() suffers from the same problem, but the actual behavior is
> not easy to describe. We could add this:
> 
>  * The objects are added in the cache if it is enabled, and if
>  * the number of objects is smaller than RTE_MEMPOOL_CACHE_MAX_SIZE.
>  * After the operation,       if the cache length is above 1.5 * size,
>  * some       objects are also returned to the common pool.

I would phrase the first part of the description like in your get() description:

 * If cache is enabled, the objects are added in the cache. If the number of
 * objects is more than RTE_MEMPOOL_CACHE_MAX_SIZE, the objects are directly
 * returned to the common pool.

And here's a rephrasing of your second part:

 * After the operation, if the cache length reaches the cache flush threshold
 * (which is 1.5 * the cache size), the objects in the cache exceeding the
 * cache size are returned to the common pool.

> 
> But I feel the comment is just a duplication of the code, but in
> english... and there's a risk that they become unsynchronized in the
> future (especially because the comment is above
> rte_mempool_generic_put() and the code is in
> __rte_mempool_generic_put()).

Why do the internal __rte_mempool_generic_put/get() functions even exist? Just 
collapse them into the public rte_mempool_generic_put/get() functions, and that 
risk would be reduced. The internal functions are only used here anyway. 
Alternatively, add the comments to both the public and internal functions.

And it's even worse: The description regarding __mempool_generic_get() also 
applies to rte_mempool_get_bulk(), where I initially stumbled into the 
unexpected (undocumented) behavior, and also to rte_mempool_get(). So regarding 
descriptions of functions that behave the way the functions they call behave... 
To copy-paste, or not to copy-paste? That is the question.


Another thing is the cache size... When creating the mempool, the cache_size 
parameter reflects the target cache length, not the actual size of the cache, 
which is bigger. The documentation doesn't contradict this, but the name of the 
parameter does. I guess the library has evolved, and the documentation didn't 
keep up. Which just proves your point above!

And while talking about the cache size:

Closely reading __mempool_generic_put() shows that the cache can hold more than 
cache->size objects. It can actually hold up to cache->flushthresh - 1 
(=cache->size * 1.5 - 1) objects, so you can consider modifying 
__mempool_generic_get()accordingly:

        /* No cache provided or cannot be satisfied from cache */
-       if (unlikely(cache == NULL || n >= cache->size))
-       if (unlikely(cache == NULL || n >= RTE_MAX(cache->size, cache->len)))
                goto ring_dequeue;

It is probably a theoretical optimization only, as it only benefits requests 
for certain numbers of elements, which to me seem unlikely. Perhaps adding a 
comment would be nice. Or just leaving it as is.

> 
> 
> 
> > PS: I stumbled into this while writing the unit test for mbuf bulk
> alloc/free.
> >
> > PPS: It seems unit tests for mempool bulk alloc/free are missing. :-)
> >
> >
> > Med venlig hilsen / kind regards
> > - Morten Brørup
> >
> >

Reply via email to