From: Stephen Hemminger <stephen@networkplumber.org>
To: Junlong Wang <wang.junlong1@zte.com.cn>
Cc: dev@dpdk.org
Subject: Re: [PATCH v12 0/4] net/zxdh: optimize Rx/Tx path performance
Date: Tue, 25 Aug 2026 12:58:16 -0700 [thread overview]
Message-ID: <20260825125816.3f69defe@stephen-xps.local> (raw)
In-Reply-To: <20260825120007.3328990-1-wang.junlong1@zte.com.cn>
On Tue, 25 Aug 2026 20:00:02 +0800
Junlong Wang <wang.junlong1@zte.com.cn> wrote:
> v12:
> - Patch 3/4 no longer introduces the unused `uint64_t offloads` field
> in `struct zxdh_virtnet_rx`, and patch 4/4's commit log drops the
> stale "drop offloads" claim so the message matches the actual diff.
>
> v11:
> - Restructure queue types for cache locality and dead-code removal (patch 2/4),
> optimize the packed-ring Rx path with a single-segment fast path,
> MTU/scatter refactor, and xstats cleanup (patch 3/4), and rework the
> packed-ring Tx flush with per-descriptor mbuf free, walk budget, and
> masked prefetch index (patch 4/4).
>
> v10:
> - Based on the issues raised in the AI review, Patch 2/4 Patch 3/4 Patch 4/4 have been modified.
>
> v9:
> - Remove add simple Tx xmit functions (zxdh_xmit_pkts_simple) in the last patch.
>
> v8:
> - Add checked the size of ZXDH_DL_NET_HDR_SIZE and RTE_PKTMBUF_HEADROOM in
> zxdh_xmit_pkts_simple() before submitting. Add static_assert to reject builds with insufficient
> default headroom at compile time.
>
> v7:
> - Add a new xmit prepare func for xmit_pkts_simple, which will checked the size of
> ZXDH_DL_NET_HDR_SIZE and RTE_PKTMBUF_HEADROOM.
>
> v6:
> - Remove unnecessary error checking code in submit_to_backend_simple() and
> pkt_padding(). Since as the max dl_net_hdr_len is always less than
> RTE_PKTMBUF_HEADROOM, rte_pktmbuf_prepend() cannot fail in the
> simple path (single-segment mbufs).
>
> v5:
> - Reorganize patch series, placing interrupt fix as the first patch
> and fix condition check to properly enable interrupts.
> - Fix zxdh_recv_single_pkts() not compacting rcv_pkts[] on failure,
> which could cause use-after-free and mbuf leak.
> - Fix tx_bunch() and tx1() missing store barrier before setting AVAIL flag,
> preventing data race on weakly-ordered architectures.
> - Fix submit_to_backend_simple() writing descriptors for packets that
> failed pkt_padding(), causing mbuf leak.
>
> v4:
> - fix some AI review issues.
> - fix queue enable intr bug.
>
> v3:
> - remove unnecessary NULL check in zxdh_init_queue.
> - Split Ring: Bit[31] is unused and reserved, zxdh_queue_notify(): removing the
> zxdh_pci_with_feature(hw, ZXDH_F_RING_PACKED) check;
> - remove unnecessary double-free in in zxdh_recv_single_pkts();
> - used rte_pktmbuf_mtod();
> - remove rxq_get_vq(q) macro, use q->vq and apply it consistently;
> - Refactoring scatter and mtu check logic in zxdh_dev_mtu_set();
> - set txdp->id = avail_idx + i in tx_bunch/tx1.
> - add comment documenting zxdh_xmit_enqueue_append() now sets dxp->cookie = NULL for
> the head slot and stores cookies per descriptor via dep[idx].cookie.
> - add one-line comment noting tx_bunch() is the simple path handles single-segment.
> - remove unnecessary Extra initialization and the uint32_t cast.
>
> v2:
> - zxdh_rxtx.c, pkt_padding(): modifyed the return value of pkt_padding();
> - zxdh_rxtx.c, zxdh_recv_single_pkts(): modifyed When zxdh_init_mbuf() fails
> the loop does "continue" and free mbufs;
> - zxdh_rxtx.c, refill_desc_unwrap(): Add rte_io_wmb() before writing flags
> in the refill_que_descs();
> - zxdh_queue.h, zxdh_queue_enable_intr(): Remove unnecessary function of zxdh_queue_enable_intr;
> - zxdh_ethdev.c, zxdh_init_queue(): changed the hdr_mz NULL check logic;
> - zxdh_rxtx.c, zxdh_xmit_pkts_simple()、zxdh_recv_single_pkts(): add stats.bytes count;
> - zxdh_rxtx.c, zxdh_init_mbuf():remove rte_pktmbuf_dump(stdout, rxm, 40);
> - zxdh_ethdev.c, zxdh_dev_free_mbufs(): using rte_pktmbuf_free() to free mbufs;
> - Splitting into separate patches, structure reorganization and sw_ring removal、
> RX recv optimize、Tx xmit optimize、Tx;
>
> v1:
> This patch optimizes the ZXDH PMD's receive and transmit path for better
> performance through several improvements:
> - Add simple TX/RX burst functions (zxdh_xmit_pkts_simple and
> zxdh_recv_single_pkts) for single-segment packet scenarios.
> - Remove RX software ring (sw_ring) to reduce memory allocation and
> copy.
> - Optimize descriptor management with prefetching and simplified
> cleanup.
> - Reorganize structure fields for better cache locality.
>
> These changes reduce CPU cycles and memory bandwidth consumption,
> resulting in improved packet processing throughput.
>
> Junlong Wang (4):
> net/zxdh: fix queue enable intr issues
> net/zxdh: optimize queue structure to improve performance
> net/zxdh: optimize Rx recv pkts performance
> net/zxdh: optimize Tx xmit pkts performance
>
> doc/guides/rel_notes/release_26_11.rst | 10 +
> drivers/net/zxdh/zxdh_ethdev.c | 85 ++++---
> drivers/net/zxdh/zxdh_ethdev_ops.c | 22 +-
> drivers/net/zxdh/zxdh_ethdev_ops.h | 7 +
> drivers/net/zxdh/zxdh_pci.c | 21 --
> drivers/net/zxdh/zxdh_pci.h | 1 -
> drivers/net/zxdh/zxdh_queue.c | 11 +-
> drivers/net/zxdh/zxdh_queue.h | 134 ++++------
> drivers/net/zxdh/zxdh_rxtx.c | 323 +++++++++++++++----------
> drivers/net/zxdh/zxdh_rxtx.h | 14 +-
> 10 files changed, 326 insertions(+), 302 deletions(-)
>
Still get some detailed AI issues..
You don't need to fix every detail and AI does tend to "bikeshed"
Review of [PATCH v12 0/4] net/zxdh: optimize queue/Rx/Tx paths
Resolved since v11
------------------
- Patch 4: the unused "uint64_t offloads" field left behind in
struct zxdh_virtnet_rx is gone; zxdh_rxtx.h is now updated in the
same patch that stops using the removed members.
- Patch 4: the descriptor walk in the Tx flush is bounded (budget
initialised to vq_nentries, break on id >= size) and the prefetch
index is masked with (size - 1).
- Patch 3: zxdh_dev_mtu_set() and zxdh_scattered_rx() now use the
same predicate (ZXDH_MTU_TO_PKTLEN vs min_rx_buf_size minus
headroom), so the two no longer diverge.
- Patch 1: Fixes: 7677f3871ef3 resolves to a real commit whose
subject matches, and the tag uses a 12-character hash.
Warnings
--------
Patch 3/4 (net/zxdh: optimize Rx recv pkts performance)
1. drivers/net/zxdh/zxdh_ethdev.c, zxdh_set_rxtx_funcs()
The ZXDH_NET_F_MRG_RXBUF runtime check is removed and replaced
with a comment stating the feature "is always negotiated (set in
both ZXDH_PMD_DEFAULT_GUEST_FEATURES and
ZXDH_PMD_DEFAULT_HOST_FEATURES)". That premise does not hold on
every path. In zxdh_get_pci_dev_config():
hw->host_features = ZXDH_PMD_DEFAULT_HOST_FEATURES;
if (hw->switchoffload)
hw->host_features = zxdh_pci_get_features(hw);
nego_features = guest_features & hw->host_features;
When switchoffload is set, host_features comes from the device,
so ZXDH_NET_F_MRG_RXBUF can be absent from the negotiated set.
Both zxdh_recv_pkts_packed() and zxdh_init_mbuf() then read
header->type_hdr.num_buffers for a device that never agreed to
populate it.
Note the old check was already ineffective in a different way:
the caller in dev_start ignores the int32_t return, so the -1
only left rx_pkt_burst/tx_pkt_burst unassigned. Either keep the
check and make dev_start actually fail on it, or narrow the
comment to the non-switchoffload case.
2. doc/guides/rel_notes/release_26_11.rst
The release note enumerates the individual counters removed
("full", "norefill", "multicast_packets", "broadcast_packets").
That level of detail does not belong in the release notes and
dates badly as the counter set keeps changing. A single bullet
along the lines of
* Changed the set of per-queue xstats counters.
covers it. The "New Features" bullets for the fast Rx path and
the packed-ring optimisation are fine as they are.
Patch 4/4 (net/zxdh: optimize Tx xmit pkts performance)
3. drivers/net/zxdh/zxdh_rxtx.c, zxdh_xmit_fast_flush()
The chain-walk scaffolding is now dead code. Both enqueue paths
write the descriptor's own index into the id field
(zxdh_xmit_enqueue_push: dp->id = id where id == vq_avail_idx;
zxdh_xmit_enqueue_append: start_dp[idx].id = idx), and the commit
message states the flush relies on desc[k].id == k being
preserved. Given that invariant, "id" always equals "used_idx",
so "curr_id != id" is false on the first pass and the do/while
body executes exactly once per outer iteration.
The result is a loop that simultaneously assumes id == index and
retains the machinery for the case where it is not, which makes
the bound reasoning harder to follow than it needs to be.
Suggest dropping id, curr_id and the inner do/while and walking a
single descriptor per outer iteration, keeping the budget counter
and the id >= size guard as the corruption backstop:
while (budget-- > 0 && desc_is_used(&desc[used_idx], vq)) {
rte_prefetch0(&desc[(used_idx +
NEXT_CACHELINE_OFF_16B) & (size - 1)]);
if (unlikely(desc[used_idx].id >= size))
break;
dxp = &vq->vq_descx[used_idx];
...
}
Info
----
Patch 3/4
4. drivers/net/zxdh/zxdh_rxtx.c, zxdh_update_packet_stats()
The patch removes stats.multicast and stats.broadcast from
struct zxdh_virtnet_stats, but the QUEUE_XSTAT block still
references them (and an undeclared "ea"). The block was already
uncompilable before this series, so nothing regresses, but since
the series is cleaning out unused counters this is a good moment
to delete the whole #ifdef QUEUE_XSTAT body. The size_bins[]
entries left in zxdh_rxq_stat_strings[]/zxdh_txq_stat_strings[]
are always zero for the same reason and are candidates for the
same cleanup.
5. drivers/net/zxdh/zxdh_rxtx.c, refill path
zxdh_queue_notify() is called whenever vq_free_cnt > 0, including
when rte_pktmbuf_alloc_bulk() inside zxdh_refill_que_descs()
failed and no descriptor was made available. Harmless, but it
costs an MMIO write on the mempool-exhausted path. Having
zxdh_refill_que_descs() return the number refilled and notifying
only on a non-zero result would avoid it.
Patch 4/4
6. drivers/net/zxdh/zxdh_rxtx.c
NEXT_CACHELINE_OFF_16B is the only macro in the file without the
ZXDH_ prefix used everywhere else in the driver. There are also
two consecutive blank lines before it.
7. drivers/net/zxdh/zxdh_rxtx.c, zxdh_xmit_enqueue_append()
The comment naming the expected readers of head cookies lists
zxdh_queue_rxvq_flush(), which only ever walks Rx virtqueues and
never sees a Tx head descriptor. zxdh_queue_detach_unused() is
the relevant one.
8. drivers/net/zxdh/zxdh_queue.h
struct zxdh_vq_desc_extra's "ndescs" is renamed to "rsv" rather
than removed. Nothing reads it after this patch, and "next" is
only written by zxdh_vring_desc_init_packed() and never read, so
the struct could be reduced to just the cookie pointer if you
want the whole array to shrink.
prev parent reply other threads:[~2026-08-25 19:58 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-26 2:28 [PATCH v1] net/zxdh: optimize Rx/Tx path performance Junlong Wang
2026-03-26 3:27 ` Stephen Hemminger
2026-04-06 4:26 ` Stephen Hemminger
2026-04-23 1:18 ` [PATCH v2 0/3] " Junlong Wang
2026-04-23 1:18 ` [PATCH v2 1/3] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-04-23 18:57 ` Stephen Hemminger
2026-04-23 1:18 ` [PATCH v2 2/3] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-04-23 18:54 ` Stephen Hemminger
2026-04-23 23:39 ` Stephen Hemminger
2026-04-23 1:18 ` [PATCH v2 3/3] net/zxdh: optimize Tx xmit " Junlong Wang
2026-04-23 19:23 ` [PATCH v2 0/3] net/zxdh: optimize Rx/Tx path performance Stephen Hemminger
2026-05-09 6:29 ` [PATCH v3 " Junlong Wang
2026-05-09 6:29 ` [PATCH v3 1/3] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-05-18 2:20 ` Stephen Hemminger
2026-05-09 6:29 ` [PATCH v3 2/3] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-05-09 6:29 ` [PATCH v3 3/3] net/zxdh: optimize Tx xmit " Junlong Wang
2026-05-18 2:22 ` Stephen Hemminger
2026-06-06 6:32 ` [PATCH v4 0/4] net/zxdh: optimize Rx/Tx path performance Junlong Wang
2026-06-06 6:32 ` [PATCH v4 1/4] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-06-06 6:32 ` [PATCH v4 2/4] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-06-06 6:32 ` [PATCH v4 3/4] net/zxdh: optimize Tx xmit " Junlong Wang
2026-06-06 6:32 ` [PATCH v4 4/4] net/zxdh: fix queue enable intr issues Junlong Wang
2026-06-07 18:00 ` [PATCH v4 0/4] net/zxdh: optimize Rx/Tx path performance Stephen Hemminger
2026-06-15 1:19 ` [PATCH v5 " Junlong Wang
2026-06-15 1:19 ` [PATCH v5 1/4] net/zxdh: fix queue enable intr issues Junlong Wang
2026-06-15 1:19 ` [PATCH v5 2/4] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-06-15 1:19 ` [PATCH v5 3/4] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-06-15 1:19 ` [PATCH v5 4/4] net/zxdh: optimize Tx xmit " Junlong Wang
2026-06-15 18:38 ` Stephen Hemminger
2026-06-17 8:28 ` [PATCH v6 0/4] net/zxdh: optimize Rx/Tx path performance Junlong Wang
2026-06-17 8:28 ` [PATCH v6 1/4] net/zxdh: fix queue enable intr issues Junlong Wang
2026-06-17 8:28 ` [PATCH v6 2/4] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-06-17 8:28 ` [PATCH v6 3/4] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-06-17 8:28 ` [PATCH v6 4/4] net/zxdh: optimize Tx xmit " Junlong Wang
2026-06-17 15:21 ` [PATCH v6 0/4] net/zxdh: optimize Rx/Tx path performance Stephen Hemminger
2026-06-23 6:09 ` [PATCH v7 " Junlong Wang
2026-06-23 6:09 ` [PATCH v7 1/4] net/zxdh: fix queue enable intr issues Junlong Wang
2026-06-23 6:09 ` [PATCH v7 2/4] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-06-23 6:09 ` [PATCH v7 3/4] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-06-23 6:09 ` [PATCH v7 4/4] net/zxdh: optimize Tx xmit " Junlong Wang
2026-06-23 15:54 ` [PATCH v7 0/4] net/zxdh: optimize Rx/Tx path performance Stephen Hemminger
2026-06-25 12:03 ` [PATCH v8 " Junlong Wang
2026-06-25 12:03 ` [PATCH v8 1/4] net/zxdh: fix queue enable intr issues Junlong Wang
2026-06-25 12:03 ` [PATCH v8 2/4] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-06-25 12:03 ` [PATCH v8 3/4] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-06-25 12:03 ` [PATCH v8 4/4] net/zxdh: optimize Tx xmit " Junlong Wang
2026-06-25 22:42 ` [PATCH v8 0/4] net/zxdh: optimize Rx/Tx path performance Stephen Hemminger
2026-06-26 3:10 ` [v8,0/4] " Junlong Wang
2026-07-03 8:17 ` Junlong Wang
2026-07-09 10:46 ` [PATCH v9 0/4] " Junlong Wang
2026-07-09 10:46 ` [PATCH v9 1/4] net/zxdh: fix queue enable intr issues Junlong Wang
2026-07-09 10:46 ` [PATCH v9 2/4] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-07-09 10:46 ` [PATCH v9 3/4] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-07-09 10:46 ` [PATCH v9 4/4] net/zxdh: optimize Tx xmit " Junlong Wang
2026-07-26 16:39 ` [PATCH v9 0/4] net/zxdh: optimize Rx/Tx path performance Stephen Hemminger
2026-08-03 11:24 ` [PATCH v10 " Junlong Wang
2026-08-03 11:24 ` [PATCH v10 1/4] net/zxdh: fix queue enable intr issues Junlong Wang
2026-08-03 11:24 ` [PATCH v10 2/4] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-08-03 11:24 ` [PATCH v10 3/4] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-08-03 11:24 ` [PATCH v10 4/4] net/zxdh: optimize Tx xmit " Junlong Wang
2026-08-04 16:33 ` [PATCH v10 0/4] net/zxdh: optimize Rx/Tx path performance Stephen Hemminger
2026-08-19 9:52 ` [PATCH v11 " Junlong Wang
2026-08-19 9:53 ` [PATCH v11 1/4] net/zxdh: fix queue enable intr issues Junlong Wang
2026-08-19 9:53 ` [PATCH v11 2/4] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-08-19 9:53 ` [PATCH v11 3/4] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-08-19 9:53 ` [PATCH v11 4/4] net/zxdh: optimize Tx xmit " Junlong Wang
2026-08-19 21:04 ` [PATCH v11 0/4] net/zxdh: optimize Rx/Tx path performance Stephen Hemminger
2026-08-25 12:00 ` [PATCH v12 " Junlong Wang
2026-08-25 12:00 ` [PATCH v12 1/4] net/zxdh: fix queue enable intr issues Junlong Wang
2026-08-25 12:00 ` [PATCH v12 2/4] net/zxdh: optimize queue structure to improve performance Junlong Wang
2026-08-25 12:00 ` [PATCH v12 3/4] net/zxdh: optimize Rx recv pkts performance Junlong Wang
2026-08-25 12:00 ` [PATCH v12 4/4] net/zxdh: optimize Tx xmit " Junlong Wang
2026-08-25 19:58 ` Stephen Hemminger [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=20260825125816.3f69defe@stephen-xps.local \
--to=stephen@networkplumber.org \
--cc=dev@dpdk.org \
--cc=wang.junlong1@zte.com.cn \
/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