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

Akihiko Odaki posted 11 patches 1 month, 3 weeks ago
[PATCH RFC v3 06/11] virtio-net: Add hash type options
Posted by Akihiko Odaki 1 month, 3 weeks ago
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 --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(),
 };
 

-- 
2.46.0