On Mon, 21 Sep 2026 15:52:13 +0000
Kai Ji <[email protected]> wrote:

> The AVX-512 TX completion path directly manipulated the mempool cache
> internals (cache->objs, cache->len, cache->flushthresh) instead of using
> the mempool API.  This pattern is the same private bypass that existed in
> the Intel common TX library before it was removed by commit 062d6fe5d00d
> ("net/intel: do not bypass mbuf lib for buffer fast-free") for the same
> reason: it omits mbuf instrumentation (history marking) and reaches
> directly into mempool cache internals, including the flushthresh field
> that is now obsolete (kept only for API/ABI compatibility), making the
> private fast path fragile against mempool cache layout changes.
> 
> Replace with a single rte_mbuf_raw_free_bulk() call, matching the Intel
> common library.  The RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE contract in
> rte_ethdev.h requires the application to guarantee that per-queue all
> mbufs come from the same mempool, have refcnt == 1, and are direct;
> that documented guarantee, whose @see already points to
> rte_mbuf_raw_free_bulk(), is exactly what makes this call correct.  The
> compiler inlines the bulk-free call to eliminate the overhead
> difference.
> 
> Fixes: 0af0bdcdcf83 ("net/sxe2: add AVX512 Rx and Tx")
> Cc: [email protected]
> 
> Signed-off-by: Kai Ji <[email protected]>
> ---

AI review had some suggestions here. They seem good:

Review: [PATCH v3] net/sxe2: replace private mempool cache bypass with
rte_mbuf_raw_free_bulk

Applied cleanly to main (6bbb7b3). common/sxe2 + net/sxe2 build clean
with -Dwerror=true, AVX512 object included.

The code change is correct. rte_mbuf_raw_free_bulk() takes the mbuf
array directly and the static_assert covers the cast. Remaining
comments are on the tags and the commit message.

Warning

  Drop "Cc: [email protected]". net/sxe2 first shipped in v26.07
  (0af0bdcdcf83 is contained in v26.07-rc2 onward); 25.11 LTS does
  not have this driver, so there is no stable branch to backport to.

  The old code was not functionally broken on current mempool:
  flushthresh is still initialized to cache->size, objs[] is still
  2 * RTE_MEMPOOL_CACHE_MAX_SIZE, and rs_thresh is capped at 64, so
  the cache invariant held. What is lost is mbuf history marking
  and debug sanity checks. That is a cleanup, not a stable fix;
  the Fixes: tag is optional.

  Commit message is too long for a 35 line deletion. Also "The
  compiler inlines the bulk-free call to eliminate the overhead
  difference" is an unsupported claim; either give throughput
  numbers or drop the sentence. Suggest:

    The AVX512 Tx free path writes directly into the mempool
    cache (objs, len, flushthresh). This skips mbuf history
    marking and depends on mempool cache internals; flushthresh
    is now obsolete.

    Use rte_mbuf_raw_free_bulk(), as done for net/intel in
    commit 062d6fe5d00d ("net/intel: do not bypass mbuf lib for
    buffer fast-free"). MBUF_FAST_FREE guarantees single pool,
    refcnt 1 and direct mbufs per queue.

Info

  The "(rs_thresh & 31) == 0" condition only existed to feed the
  32-wide unrolled AVX512 copy loop. rs_thresh is validated to
  32..64 in sxe2_txrx_vec.c, so e.g. rs_thresh=48 currently falls
  back to the per-mbuf prefree path even with MBUF_FAST_FREE set.
  With rte_mbuf_raw_free_bulk() the guard serves no purpose; drop
  it.

  No v2 -> v3 changelog below the "---".

Reply via email to