diff mbox series

[RFC,v3,06/11] virtio-net: Add hash type options

Message ID 20240915-hash-v3-6-79cb08d28647@daynix.com
State New
Headers show
Series virtio-net: Offload hashing without eBPF | expand

Commit Message

Akihiko Odaki Sept. 15, 2024, 1:23 a.m. UTC
By default, virtio-net limits the hash types that will be advertised to
the guest so that all hash types are covered by the offloading
capability the client provides. This change allows to override this
behavior and to advertise hash types that require user-space hash
calculation by specifying "on" for the corresponding properties.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
 include/hw/virtio/virtio-net.h |  1 +
 hw/net/virtio-net.c            | 45 ++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 44 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/include/hw/virtio/virtio-net.h b/include/hw/virtio/virtio-net.h
index 202016ec74fc..cc6da6ad6a1b 100644
--- a/include/hw/virtio/virtio-net.h
+++ b/include/hw/virtio/virtio-net.h
@@ -148,6 +148,7 @@  typedef struct VirtioNetRssData {
     uint32_t runtime_hash_types;
     uint32_t supported_hash_types;
     uint32_t peer_hash_types;
+    OnOffAutoBit specified_hash_types;
     uint8_t key[VIRTIO_NET_RSS_MAX_KEY_SIZE];
     uint16_t indirections_len;
     uint16_t *indirections_table;
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 3da15a60eaa5..38ccd706f956 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -3808,9 +3808,14 @@  static void virtio_net_device_realize(DeviceState *dev, Error **errp)
     if (qemu_get_vnet_hash_supported_types(qemu_get_queue(n->nic)->peer,
                                            &n->rss_data.peer_hash_types)) {
         n->rss_data.peer_hash_available = true;
-        n->rss_data.supported_hash_types = n->rss_data.peer_hash_types;
+        n->rss_data.supported_hash_types =
+            n->rss_data.specified_hash_types.on_bits |
+            (n->rss_data.specified_hash_types.auto_bits &
+             n->rss_data.peer_hash_types);
     } else {
-        n->rss_data.supported_hash_types = VIRTIO_NET_RSS_SUPPORTED_HASHES;
+        n->rss_data.supported_hash_types =
+            n->rss_data.specified_hash_types.on_bits |
+            n->rss_data.specified_hash_types.auto_bits;
     }
 }
 
@@ -4035,6 +4040,42 @@  static Property virtio_net_properties[] = {
                       VIRTIO_NET_F_GUEST_USO6, true),
     DEFINE_PROP_BIT64("host_uso", VirtIONet, host_features,
                       VIRTIO_NET_F_HOST_USO, true),
+    DEFINE_PROP_ON_OFF_AUTO_BIT("hash-ipv4", VirtIONet,
+                                rss_data.specified_hash_types,
+                                VIRTIO_NET_HASH_REPORT_IPv4 - 1,
+                                ON_OFF_AUTO_AUTO),
+    DEFINE_PROP_ON_OFF_AUTO_BIT("hash-tcp4", VirtIONet,
+                                rss_data.specified_hash_types,
+                                VIRTIO_NET_HASH_REPORT_TCPv4 - 1,
+                                ON_OFF_AUTO_AUTO),
+    DEFINE_PROP_ON_OFF_AUTO_BIT("hash-udp4", VirtIONet,
+                                rss_data.specified_hash_types,
+                                VIRTIO_NET_HASH_REPORT_UDPv4 - 1,
+                                ON_OFF_AUTO_AUTO),
+    DEFINE_PROP_ON_OFF_AUTO_BIT("hash-ipv6", VirtIONet,
+                                rss_data.specified_hash_types,
+                                VIRTIO_NET_HASH_REPORT_IPv6 - 1,
+                                ON_OFF_AUTO_AUTO),
+    DEFINE_PROP_ON_OFF_AUTO_BIT("hash-tcp6", VirtIONet,
+                                rss_data.specified_hash_types,
+                                VIRTIO_NET_HASH_REPORT_TCPv6 - 1,
+                                ON_OFF_AUTO_AUTO),
+    DEFINE_PROP_ON_OFF_AUTO_BIT("hash-udp6", VirtIONet,
+                                rss_data.specified_hash_types,
+                                VIRTIO_NET_HASH_REPORT_UDPv6 - 1,
+                                ON_OFF_AUTO_AUTO),
+    DEFINE_PROP_ON_OFF_AUTO_BIT("hash-ipv6ex", VirtIONet,
+                                rss_data.specified_hash_types,
+                                VIRTIO_NET_HASH_REPORT_IPv6_EX - 1,
+                                ON_OFF_AUTO_AUTO),
+    DEFINE_PROP_ON_OFF_AUTO_BIT("hash-tcp6ex", VirtIONet,
+                                rss_data.specified_hash_types,
+                                VIRTIO_NET_HASH_REPORT_TCPv6_EX - 1,
+                                ON_OFF_AUTO_AUTO),
+    DEFINE_PROP_ON_OFF_AUTO_BIT("hash-udp6ex", VirtIONet,
+                                rss_data.specified_hash_types,
+                                VIRTIO_NET_HASH_REPORT_UDPv6_EX - 1,
+                                ON_OFF_AUTO_AUTO),
     DEFINE_PROP_END_OF_LIST(),
 };