Two AF_XDP zero-copy fixes for virtio_net.

Patch 1: on arm64, binding a zero-copy socket fails with -ENOMEM and a
"rejecting DMA map of vmalloc memory" warning whenever the device uses
the DMA API (e.g. VIRTIO_F_ACCESS_PLATFORM), because the static TX
header lives in the kernel image, which arm64 maps in the vmalloc area.

Patch 2: removing XDP, explicitly or when the device is unregistered,
can leave a zero-copy pool bound to a queue above curr_queue_pairs.
Unbinding the socket then fails in the driver, and the queue is
refilled from the freed pool.

The suspend fix that was patch 3 in v2 is dropped from this series.
Review found problems with it for pools on queues above
curr_queue_pairs; it will be reworked and sent separately on top of
these two.

Testing used KASAN kernels in QEMU with virtio-net-pci and
iommu_platform=on:

- Patch 1 on arm64 (TCG, virt): binding an XDP_ZEROCOPY socket fails
  without the patch and succeeds with it.
- Patch 2 on x86_64 (KVM, q35, intel-iommu, two queue pairs): with a
  socket bound to an XDP queue, removing XDP and then closing the
  socket gives "Failed to disable zero-copy!" and a KASAN
  use-after-free in xp_alloc_batch() on net, and no warnings with this
  series. Unbinding the device from virtio_net with XDP attached and a
  socket on an XDP queue gives "Failed to disable zero-copy!" on net,
  and no warning with this series. In both cases the unregister then
  keeps waiting for eth0 to become free; that also happens with only
  XDP attached and no socket, so it is a separate issue.

The issues were found with the help of an AI coding assistant.

Changes in v3:
- Drop patch 3, to be reworked and sent separately (Sashiko).
- Patch 2: mention the unregister path in the changelog (Sashiko).
- Rebased on net 1d5e2c57e9ff; the code of patches 1 and 2 is
  unchanged.

Changes in v2:
- Patch 1: drop the sentence about cache lines from the changelog
  (Sashiko).
- New patch 2, for a pool left on a queue above curr_queue_pairs
  (Sashiko).
- Patch 3: rework (Sashiko).

v2: 
https://lore.kernel.org/netdev/[email protected]/
v1: 
https://lore.kernel.org/netdev/[email protected]/

Haishuang Yan (2):
  virtio_net: Don't DMA map the kernel image for the AF_XDP TX header
  virtio_net: Disable AF_XDP pools on queues above curr_queue_pairs

 drivers/net/virtio_net.c | 26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)


base-commit: 1d5e2c57e9ffc134e14b3f837c8d7c53b508bd22
-- 
2.43.0




Reply via email to