XDP socket is an excellent by pass kernel network transmission framework. The zero copy feature of xsk (XDP socket) needs to be supported by the driver. The performance of zero copy is very good. mlx5 and intel ixgbe already support this feature, This patch set allows virtio-net to support xsk's zerocopy xmit feature. Compared with other drivers, the trouble with virtio-net is that when we bind the channel to xsk, we cannot directly disable/enable the channel. So we have to consider the buf that has been placed in the vq after the xsk is released by the upper layer. My solution is to add a ctx to each buf placed in vq to record the page used, and add a reference to the page. So when the upper xsk is released, these pages are still safe in vq. We will process these bufs when we recycle buf or receive new data. In the case of rx, it will be more complicated, because we may encounter the buf of xsk, or it may be a normal buf. Especially in the case of merge, we may receive multiple bufs, and these bufs may be xsk buf and normal are mixed together. v5: support rx v4: 1. add priv_flags IFF_NOT_USE_DMA_ADDR 2. more reasonable patch split Xuan Zhuo (15): netdevice: priv_flags extend to 64bit netdevice: add priv_flags IFF_NOT_USE_DMA_ADDR virtio-net: add priv_flags IFF_NOT_USE_DMA_ADDR xsk: XDP_SETUP_XSK_POOL support option IFF_NOT_USE_DMA_ADDR virtio: support virtqueue_detach_unused_buf_ctx virtio-net: unify the code for recycling the xmit ptr virtio-net: standalone virtnet_aloc_frag function virtio-net: split the receive_mergeable function virtio-net: virtnet_poll_tx support budget check virtio-net: independent directory virtio-net: move to virtio_net.h virtio-net: support AF_XDP zc tx virtio-net: support AF_XDP zc rx virtio-net: xsk direct xmit inside xsk wakeup virtio-net: xsk zero copy xmit kick by threshold MAINTAINERS | 2 +- drivers/net/Kconfig | 8 +- drivers/net/Makefile | 2 +- drivers/net/virtio/Kconfig | 11 + drivers/net/virtio/Makefile | 7 + drivers/net/{ => virtio}/virtio_net.c | 670 +++++++++++----------- drivers/net/virtio/virtio_net.h | 288 ++++++++++ drivers/net/virtio/xsk.c | 766 ++++++++++++++++++++++++++ drivers/net/virtio/xsk.h | 176 ++++++ drivers/virtio/virtio_ring.c | 22 +- include/linux/netdevice.h | 143 ++--- include/linux/virtio.h | 2 + net/8021q/vlanproc.c | 2 +- net/xdp/xsk_buff_pool.c | 2 +- 14 files changed, 1664 insertions(+), 437 deletions(-) create mode 100644 drivers/net/virtio/Kconfig create mode 100644 drivers/net/virtio/Makefile rename drivers/net/{ => virtio}/virtio_net.c (92%) create mode 100644 drivers/net/virtio/virtio_net.h create mode 100644 drivers/net/virtio/xsk.c create mode 100644 drivers/net/virtio/xsk.h -- 2.31.0