QE tested this series of patches's v9 with virtio-net regression tests, everything works fine. Tested-by: Lei Yang <leiyang@xxxxxxxxxx> On Fri, Mar 7, 2025 at 7:01 PM Akihiko Odaki <akihiko.odaki@xxxxxxxxxx> wrote: > > virtio-net have two usage of hashes: one is RSS and another is hash > reporting. Conventionally the hash calculation was done by the VMM. > However, computing the hash after the queue was chosen defeats the > purpose of RSS. > > Another approach is to use eBPF steering program. This approach has > another downside: it cannot report the calculated hash due to the > restrictive nature of eBPF. > > Introduce the code to compute hashes to the kernel in order to overcome > thse challenges. > > An alternative solution is to extend the eBPF steering program so that it > will be able to report to the userspace, but it is based on context > rewrites, which is in feature freeze. We can adopt kfuncs, but they will > not be UAPIs. We opt to ioctl to align with other relevant UAPIs (KVM > and vhost_net). > > The patches for QEMU to use this new feature was submitted as RFC and > is available at: > https://patchew.org/QEMU/20240915-hash-v3-0-79cb08d28647@xxxxxxxxxx/ > > This work was presented at LPC 2024: > https://lpc.events/event/18/contributions/1963/ > > V1 -> V2: > Changed to introduce a new BPF program type. > > Signed-off-by: Akihiko Odaki <akihiko.odaki@xxxxxxxxxx> > --- > Changes in v9: > - Added a missing return statement in patch > "tun: Introduce virtio-net hash feature". > - Link to v8: https://lore.kernel.org/r/20250306-rss-v8-0-7ab4f56ff423@xxxxxxxxxx > > Changes in v8: > - Disabled IPv6 to eliminate noises in tests. > - Added a branch in tap to avoid unnecessary dissection when hash > reporting is disabled. > - Removed unnecessary rtnl_lock(). > - Extracted code to handle new ioctls into separate functions to avoid > adding extra NULL checks to the code handling other ioctls. > - Introduced variable named "fd" to __tun_chr_ioctl(). > - s/-/=/g in a patch message to avoid confusing Git. > - Link to v7: https://lore.kernel.org/r/20250228-rss-v7-0-844205cbbdd6@xxxxxxxxxx > > Changes in v7: > - Ensured to set hash_report to VIRTIO_NET_HASH_REPORT_NONE for > VHOST_NET_F_VIRTIO_NET_HDR. > - s/4/sizeof(u32)/ in patch "virtio_net: Add functions for hashing". > - Added tap_skb_cb type. > - Rebased. > - Link to v6: https://lore.kernel.org/r/20250109-rss-v6-0-b1c90ad708f6@xxxxxxxxxx > > Changes in v6: > - Extracted changes to fill vnet header holes into another series. > - Squashed patches "skbuff: Introduce SKB_EXT_TUN_VNET_HASH", "tun: > Introduce virtio-net hash reporting feature", and "tun: Introduce > virtio-net RSS" into patch "tun: Introduce virtio-net hash feature". > - Dropped the RFC tag. > - Link to v5: https://lore.kernel.org/r/20241008-rss-v5-0-f3cf68df005d@xxxxxxxxxx > > Changes in v5: > - Fixed a compilation error with CONFIG_TUN_VNET_CROSS_LE. > - Optimized the calculation of the hash value according to: > https://git.dpdk.org/dpdk/commit/?id=3fb1ea032bd6ff8317af5dac9af901f1f324cab4 > - Added patch "tun: Unify vnet implementation". > - Dropped patch "tap: Pad virtio header with zero". > - Added patch "selftest: tun: Test vnet ioctls without device". > - Reworked selftests to skip for older kernels. > - Documented the case when the underlying device is deleted and packets > have queue_mapping set by TC. > - Reordered test harness arguments. > - Added code to handle fragmented packets. > - Link to v4: https://lore.kernel.org/r/20240924-rss-v4-0-84e932ec0e6c@xxxxxxxxxx > > Changes in v4: > - Moved tun_vnet_hash_ext to if_tun.h. > - Renamed virtio_net_toeplitz() to virtio_net_toeplitz_calc(). > - Replaced htons() with cpu_to_be16(). > - Changed virtio_net_hash_rss() to return void. > - Reordered variable declarations in virtio_net_hash_rss(). > - Removed virtio_net_hdr_v1_hash_from_skb(). > - Updated messages of "tap: Pad virtio header with zero" and > "tun: Pad virtio header with zero". > - Fixed vnet_hash allocation size. > - Ensured to free vnet_hash when destructing tun_struct. > - Link to v3: https://lore.kernel.org/r/20240915-rss-v3-0-c630015db082@xxxxxxxxxx > > Changes in v3: > - Reverted back to add ioctl. > - Split patch "tun: Introduce virtio-net hashing feature" into > "tun: Introduce virtio-net hash reporting feature" and > "tun: Introduce virtio-net RSS". > - Changed to reuse hash values computed for automq instead of performing > RSS hashing when hash reporting is requested but RSS is not. > - Extracted relevant data from struct tun_struct to keep it minimal. > - Added kernel-doc. > - Changed to allow calling TUNGETVNETHASHCAP before TUNSETIFF. > - Initialized num_buffers with 1. > - Added a test case for unclassified packets. > - Fixed error handling in tests. > - Changed tests to verify that the queue index will not overflow. > - Rebased. > - Link to v2: https://lore.kernel.org/r/20231015141644.260646-1-akihiko.odaki@xxxxxxxxxx > > --- > Akihiko Odaki (6): > virtio_net: Add functions for hashing > net: flow_dissector: Export flow_keys_dissector_symmetric > tun: Introduce virtio-net hash feature > selftest: tun: Test vnet ioctls without device > selftest: tun: Add tests for virtio-net hashing > vhost/net: Support VIRTIO_NET_F_HASH_REPORT > > Documentation/networking/tuntap.rst | 7 + > drivers/net/Kconfig | 1 + > drivers/net/tap.c | 68 +++- > drivers/net/tun.c | 98 +++++- > drivers/net/tun_vnet.h | 159 ++++++++- > drivers/vhost/net.c | 49 +-- > include/linux/if_tap.h | 2 + > include/linux/skbuff.h | 3 + > include/linux/virtio_net.h | 188 ++++++++++ > include/net/flow_dissector.h | 1 + > include/uapi/linux/if_tun.h | 75 ++++ > net/core/flow_dissector.c | 3 +- > net/core/skbuff.c | 4 + > tools/testing/selftests/net/Makefile | 2 +- > tools/testing/selftests/net/tun.c | 656 ++++++++++++++++++++++++++++++++++- > 15 files changed, 1255 insertions(+), 61 deletions(-) > --- > base-commit: dd83757f6e686a2188997cb58b5975f744bb7786 > change-id: 20240403-rss-e737d89efa77 > prerequisite-change-id: 20241230-tun-66e10a49b0c7:v6 > prerequisite-patch-id: 871dc5f146fb6b0e3ec8612971a8e8190472c0fb > prerequisite-patch-id: 2797ed249d32590321f088373d4055ff3f430a0e > prerequisite-patch-id: ea3370c72d4904e2f0536ec76ba5d26784c0cede > prerequisite-patch-id: 837e4cf5d6b451424f9b1639455e83a260c4440d > prerequisite-patch-id: ea701076f57819e844f5a35efe5cbc5712d3080d > prerequisite-patch-id: 701646fb43ad04cc64dd2bf13c150ccbe6f828ce > prerequisite-patch-id: 53176dae0c003f5b6c114d43f936cf7140d31bb5 > prerequisite-change-id: 20250116-buffers-96e14bf023fc:v2 > prerequisite-patch-id: 25fd4f99d4236a05a5ef16ab79f3e85ee57e21cc > > Best regards, > -- > Akihiko Odaki <akihiko.odaki@xxxxxxxxxx> >