]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xsk: Bring back busy polling support in XDP_COPY
authorSamiullah Khawaja <skhawaja@google.com>
Fri, 16 May 2025 21:36:38 +0000 (21:36 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 21 May 2025 09:28:23 +0000 (10:28 +0100)
Commit 5ef44b3cb43b ("xsk: Bring back busy polling support") fixed the
busy polling support in xsk for XDP_ZEROCOPY after it was broken in
commit 86e25f40aa1e ("net: napi: Add napi_config"). The busy polling
support with XDP_COPY remained broken since the napi_id setup in
xsk_rcv_check was removed.

Bring back the setup of napi_id for XDP_COPY so socket level SO_BUSYPOLL
can be used to poll the underlying napi.

Do the setup of napi_id for XDP_COPY in xsk_bind, as it is done
currently for XDP_ZEROCOPY. The setup of napi_id for XDP_COPY in
xsk_bind is safe because xsk_rcv_check checks that the rx queue at which
the packet arrives is equal to the queue_id that was supplied in bind.
This is done for both XDP_COPY and XDP_ZEROCOPY mode.

Tested using AF_XDP support in virtio-net by running the xsk_rr AF_XDP
benchmarking tool shared here:
https://lore.kernel.org/all/20250320163523.3501305-1-skhawaja@google.com/T/

Enabled socket busy polling using following commands in qemu,

```
sudo ethtool -L eth0 combined 1
echo 400 | sudo tee /proc/sys/net/core/busy_read
echo 100 | sudo tee /sys/class/net/eth0/napi_defer_hard_irqs
echo 15000   | sudo tee /sys/class/net/eth0/gro_flush_timeout
```

Fixes: 5ef44b3cb43b ("xsk: Bring back busy polling support")
Signed-off-by: Samiullah Khawaja <skhawaja@google.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/xdp/xsk.c

index 4abc81f33d3ebec5f80b76d5d4a93bccdbab8c01..72c000c0ae5f57e6b710deeb74717ff965d9f8f1 100644 (file)
@@ -1304,7 +1304,7 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
        xs->queue_id = qid;
        xp_add_xsk(xs->pool, xs);
 
-       if (xs->zc && qid < dev->real_num_rx_queues) {
+       if (qid < dev->real_num_rx_queues) {
                struct netdev_rx_queue *rxq;
 
                rxq = __netif_get_rx_queue(dev, qid);