[PATCH net 0/7] xsk: fix AF_XDP multi-buffer Tx descriptor reclaim
From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Date: 2026-06-23 13:33:18
Also in:
bpf
Hi, This series fixes several AF_XDP multi-buffer Tx paths where descriptors consumed from the Tx ring are not consistently returned to userspace through the completion ring when the packet is later dropped as invalid. The affected cases are invalid or oversized multi-buffer Tx packets in both the generic and zero-copy paths. In these cases, the kernel can consume one or more Tx descriptors while building or validating a multi-buffer packet, then drop the packet before it reaches the device. Userspace still owns the UMEM buffers only after the corresponding addresses are returned through the CQ. Missing completions therefore make userspace lose track of those buffers. The generic path fixes cover three related cases: * partially built multi-buffer skbs dropped by xsk_drop_skb(); continuation descriptors left in the Tx ring after xsk_build_skb() reports overflow; * invalid descriptors encountered in the middle of a multi-buffer packet, including the offending invalid descriptor itself. The zero-copy path is handled separately. The batched Tx parser now distinguishes descriptors that can be passed to the driver from descriptors that are consumed only because they belong to an invalid multi-buffer packet. Reclaim-only descriptors are written to the CQ address area and published in completion order, after any earlier driver-visible Tx descriptors. The ZC batching path can also retain drain state when userspace has not yet provided the end of an invalid multi-buffer packet. To keep this state local to the singular batched path, the series prevents a second Tx socket from joining the same pool while such drain state exists. During the singular-to-shared transition, Tx batching is gated, pre-existing readers are waited out, and bind fails with -EAGAIN if the existing socket still has pending drain state. This avoids adding multi-buffer drain handling to the shared-UMEM fallback path. The last two patches update xskxceiver so the tests account invalid multi-buffer Tx packets as descriptors that must be reclaimed, while still not expecting those invalid packets on the Rx side. This is a follow-up to Jason's changes [0] which were addressing generic xmit only and this set allows me to pass full xskxceiver test suite run against ice driver. Thanks, Maciej [0]: https://lore.kernel.org/netdev/20260520004244.55663-1-kerneljasonxing@gmail.com/ (local) Jason Xing (3): xsk: fix buffer leak in xsk_drop_skb() for AF_XDP multi-buffer Tx xsk: drain continuation descs after overflow in xsk_build_skb() xsk: drain continuation descs on invalid descriptor in __xsk_generic_xmit() Maciej Fijalkowski (4): xsk: reclaim offending invalid desc in generic multi-buffer Tx xsk: reclaim invalid multi-buffer Tx descs in ZC path selftests/xsk: fix too-many-frags multi-buffer Tx test selftests/xsk: account invalid multi-buffer Tx descriptors include/net/xdp_sock.h | 1 + include/net/xsk_buff_pool.h | 6 + net/xdp/xsk.c | 114 ++++++++++++++++-- net/xdp/xsk_buff_pool.c | 66 ++++++++++ net/xdp/xsk_queue.h | 66 +++++++--- .../selftests/bpf/prog_tests/test_xsk.c | 44 ++++--- 6 files changed, 254 insertions(+), 43 deletions(-) -- 2.43.0