If kernel supports IFF_NAPI, lets use it, which is especially useful on kernels containing fb3f903769e8 ("tun: support NAPI for packets received from batched XDP buffs"), as IFF_NAPI allows the vhost_tx_batch path to use NAPI on XDP buffs.
Benchmark w/ iperf -c (remote srv) -P (thread count) -l (stream size) from a guest running kernel 5.10.105 to remote bare metal running patched code on kernel 5.10.139. Guests were configured 1x virtio-net device with 4x queues, resulting in 4x vhost-worker threads. Hosts are identical with Intel ICX 4314 @ 2.4 GHz with Mellanox CX5 25GbE NIC -> Arista 25GbE switch. vhost-worker threads largely maxed out on CPU on "Before" and around ~50-60% utilization "After". Single Stream: iperf -P 1 iperf -l size | Before | After | Increase 64B | 593 Mbits/sec | 712 Mbits/sec | ~20% 128B | 1.00 Gbits/sec | 1.18 Gbits/sec | ~18% 4KB | 17.6 Gbits/sec | 22.7 Gbits/sec | ~29% Multiple Stream: iperf -P 12 iperf -l size | Before | After | Increase 64B | 6.35 Gbits/sec | 7.78 Gbits/sec | ~23% 128B | 10.8 Gbits/sec | 14.2 Gbits/sec | ~31% 4KB | 23.6 Gbits/sec | 23.6 Gbits/sec | (line speed) Signed-off-by: Jon Kohler <j...@nutanix.com> --- net/tap-linux.c | 4 ++++ net/tap-linux.h | 1 + 2 files changed, 5 insertions(+) diff --git a/net/tap-linux.c b/net/tap-linux.c index f54f308d359..fd94df166e0 100644 --- a/net/tap-linux.c +++ b/net/tap-linux.c @@ -62,6 +62,10 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, ifr.ifr_flags |= IFF_ONE_QUEUE; } + if (features & IFF_NAPI) { + ifr.ifr_flags |= IFF_NAPI; + } + if (*vnet_hdr) { if (features & IFF_VNET_HDR) { *vnet_hdr = 1; diff --git a/net/tap-linux.h b/net/tap-linux.h index bbbb62c2a75..f4d8e55270b 100644 --- a/net/tap-linux.h +++ b/net/tap-linux.h @@ -37,6 +37,7 @@ /* TUNSETIFF ifr flags */ #define IFF_TAP 0x0002 +#define IFF_NAPI 0x0010 #define IFF_NO_PI 0x1000 #define IFF_ONE_QUEUE 0x2000 #define IFF_VNET_HDR 0x4000 -- 2.30.1 (Apple Git-130)