From: "Morten Brørup" <mb@smartsharesystems.com>
To: "Olivier Matz" <olivier.matz@6wind.com>
Cc: "Andrew Rybchenko" <arybchenko@solarflare.com>,
"dpdk-dev" <dev@dpdk.org>
Subject: Re: [dpdk-dev] rte_mempool_get_bulk uses either cache or common pool
Date: Thu, 17 Oct 2019 11:46:48 +0200 [thread overview]
Message-ID: <98CBD80474FA8B44BF855DF32C47DC35C60B85@smartserver.smartshare.dk> (raw)
In-Reply-To: <20191016072242.3dr7i7xmdokztjd4@platinum>
> -----Original Message-----
> From: Olivier Matz [mailto:olivier.matz@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
> >
> >
prev parent reply other threads:[~2019-10-17 9:46 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-11 11:24 Morten Brørup
2019-10-16 7:22 ` Olivier Matz
2019-10-17 9:46 ` Morten Brørup [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=98CBD80474FA8B44BF855DF32C47DC35C60B85@smartserver.smartshare.dk \
--to=mb@smartsharesystems.com \
--cc=arybchenko@solarflare.com \
--cc=dev@dpdk.org \
--cc=olivier.matz@6wind.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).