Re: [RFC PATCH v2] mempool: optimizations

Bruce Richardson <[email protected]>
Newsgroups org.dpdk.dev
Message-ID <[email protected]>
On Wed, Aug 12, 2026 at 12:06:26PM +0000, Morten Brørup wrote:
> This patch introduces some mempool optimizations, which might be
> controversial.
> 
> 1. Access local cache without first accessing the mempool header struct.
> 
> When getting/putting objects in a mempool cache, it required accessing
> the "size" field and "local_cache" pointer in the mempool structure, to
> determine if the local cache was present.
> 
> The mempool structure was changed, so the local cache array is now an
> integral part of the mempool structure.  This means that local cache can
> be accessed directly, without first checking the "size" and "local_cache"
> fields in the mempool header structure.  This avoids a couple of load
> operations with a potential CPU cache miss when the mempool header itself
> is not hot in the CPU cache.  The "local_cache" field was changed from
> being a pointer to the local cache array, and instead became the local
> cache array itself.
> 
> This change similarly speeds up rte_mempool_get_priv(), because it no
> longer needs to access the mempool header structure (specifically, the
> "cache_size" field) to determine the address of the mempool's private
> data.
> 
> Disadvantage: Memory for local cache is also consumed by mempools
> configured without cache.
> 
> Related changes: - The mempool cache audit function was improved.  - The
> mempool autotest accessed the internal RTE_MEMPOOL_HEADER_SIZE macro, and
> was updated accordingly.
> 
> 2. Move objects in mempool cache as 32-byte chunks at CPU cache line
> aligned addresses.
> 
> Improved memory copy performance by ensuring that objects in mempool
> cache can be moved as 32-byte chunks at CPU cache line aligned addresses.
> 
> This introduces a new requirement: The mempool cache size must be
> divisible by 32.  The new requirement may be beneficial for future
> purposes.
> 
> Disadvantage: Mempool cache size must be divisible by 32.  For
> compatibility purposes, a requested cache size not divisible by 32 is
> handled by a graceful fallback at mempool cache creation and mempool
> creation.
> 
> Related changes: - The TAP driver used a mempool cache size of 4 mbufs
> for GSO, and was updated to a cache size of 32 mbufs.
> 
> Other changes: - The description of the RTE_MEMPOOL_NAMESIZE macro was
> expanded to explain how the value is derived.
> 
> Signed-off-by: Morten Brørup <[email protected]> --- v2: * Removed
> patch dependency, and included dependent patch instead.  Trying to fix
> apply patch failure.  v2 resend: * Improved patch description.  ---
> app/test/test_mempool.c                 |  3 +-
> doc/guides/rel_notes/release_26_11.rst  |  6 ++
> drivers/net/sxe2/sxe2_txrx_vec_avx512.c |  2 +-
> drivers/net/tap/rte_eth_tap.c           |  2 +-
> lib/eal/include/rte_common.h            | 12 +++
> lib/mempool/mempool_trace.h             |  1 - lib/mempool/rte_mempool.c
> | 76 +++++++++++++------ lib/mempool/rte_mempool.h               | 97
> ++++++++++++++----------- 8 files changed, 131 insertions(+), 68
> deletions(-)
> 
> diff --git a/app/test/test_mempool.c b/app/test/test_mempool.c index
> e54249ce61..76d45cea2a 100644 --- a/app/test/test_mempool.c +++
> b/app/test/test_mempool.c @@ -112,8 +112,7 @@ test_mempool_basic(struct
> rte_mempool *mp, int use_external_cache) GOTO_ERR(ret, out);
>  
>  	printf("get private data\n"); -	if (rte_mempool_get_priv(mp) !=
>  	(char *)mp + -			RTE_MEMPOOL_HEADER_SIZE(mp,
>  	mp->cache_size)) +	if (rte_mempool_get_priv(mp) != (char *)mp
>  	+ sizeof(struct rte_mempool)) GOTO_ERR(ret, out);
>  
>  #ifndef RTE_EXEC_ENV_FREEBSD /* rte_mem_virt2iova() not supported on bsd
>  */ diff --git a/doc/guides/rel_notes/release_26_11.rst
>  b/doc/guides/rel_notes/release_26_11.rst index c8cc86295d..e31325585a
>  100644 --- a/doc/guides/rel_notes/release_26_11.rst +++
>  b/doc/guides/rel_notes/release_26_11.rst @@ -68,6 +68,8 @@ Removed Items
>  Also, make sure to start the actual text at the margin.
>  =======================================================
>  
> +* mempool: The obsolete ``flushthresh`` field was removed from the
> ``rte_mempool_cache`` structure.  + * Removed deprecated symbols:
>  
I'm not convinced about removing this field at this point. Based on
previous discussions around run-to-completion vs pipeline apps, and the
reported performance degradations due to recent cache changes, I could
see a scenario where it's useful to track a separate flushthreshold or
cache-keep threshold for a mempool.

/Bruce
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.