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 "---".

