yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
76daa3
From 627adfaf4c1b732a1d5694a0510ecda7f6eef998 Mon Sep 17 00:00:00 2001
76daa3
From: Maxime Coquelin <maxime.coquelin@redhat.com>
76daa3
Date: Thu, 1 Jun 2017 09:24:15 +0200
76daa3
Subject: [PATCH 07/13] virtio_net: Bypass backends for MTU feature negotiation
76daa3
76daa3
RH-Author: Maxime Coquelin <maxime.coquelin@redhat.com>
76daa3
Message-id: <20170601092415.2215-1-maxime.coquelin@redhat.com>
76daa3
Patchwork-id: 75454
76daa3
O-Subject: [RHEL7.4 qemu-kvm-rhev] virtio_net: Bypass backends for MTU feature negotiation
76daa3
Bugzilla: 1452756
76daa3
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
76daa3
RH-Acked-by: Jens Freimann <jfreiman@redhat.com>
76daa3
RH-Acked-by: Vlad Yasevich <vyasevic@redhat.com>
76daa3
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
76daa3
76daa3
This patch adds a new internal "x-mtu-bypass-backend" property
76daa3
to bypass backends for MTU feature negotiation.
76daa3
76daa3
When this property is set, the MTU feature is negotiated as soon
76daa3
as supported by the guest and a MTU value is set via the host_mtu
76daa3
parameter. In case the backend advertises the feature (e.g. DPDK's
76daa3
vhost-user backend), the feature negotiation is propagated down to
76daa3
the backend.
76daa3
76daa3
When this property is not set, the backend has to support the MTU
76daa3
feature for its negotiation to succeed.
76daa3
76daa3
For compatibility purpose, this property is disabled for machine
76daa3
types RHEL7.3 (vs. v2.9 for upstream) and older.
76daa3
76daa3
Cc: Aaron Conole <aconole@redhat.com>
76daa3
Suggested-by: Michael S. Tsirkin <mst@redhat.com>
76daa3
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
76daa3
Reviewed-by: Vlad Yasevich <vyasevic@redhat.com>
76daa3
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
76daa3
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
76daa3
(cherry picked from commit 75ebec11afe49539f71cc1c494e3010f91c86adb)
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
---
76daa3
 hw/net/virtio-net.c            | 17 ++++++++++++++++-
76daa3
 include/hw/compat.h            |  4 ++++
76daa3
 include/hw/virtio/virtio-net.h |  1 +
76daa3
 include/hw/virtio/virtio.h     |  1 +
76daa3
 4 files changed, 22 insertions(+), 1 deletion(-)
76daa3
76daa3
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
76daa3
index 7d091c9..39c336e 100644
76daa3
--- a/hw/net/virtio-net.c
76daa3
+++ b/hw/net/virtio-net.c
76daa3
@@ -589,7 +589,15 @@ static uint64_t virtio_net_get_features(VirtIODevice *vdev, uint64_t features,
76daa3
     if (!get_vhost_net(nc->peer)) {
76daa3
         return features;
76daa3
     }
76daa3
-    return vhost_net_get_features(get_vhost_net(nc->peer), features);
76daa3
+    features = vhost_net_get_features(get_vhost_net(nc->peer), features);
76daa3
+    vdev->backend_features = features;
76daa3
+
76daa3
+    if (n->mtu_bypass_backend &&
76daa3
+            (n->host_features & 1ULL << VIRTIO_NET_F_MTU)) {
76daa3
+        features |= (1ULL << VIRTIO_NET_F_MTU);
76daa3
+    }
76daa3
+
76daa3
+    return features;
76daa3
 }
76daa3
 
76daa3
 static uint64_t virtio_net_bad_features(VirtIODevice *vdev)
76daa3
@@ -640,6 +648,11 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features)
76daa3
     VirtIONet *n = VIRTIO_NET(vdev);
76daa3
     int i;
76daa3
 
76daa3
+    if (n->mtu_bypass_backend &&
76daa3
+            !virtio_has_feature(vdev->backend_features, VIRTIO_NET_F_MTU)) {
76daa3
+        features &= ~(1ULL << VIRTIO_NET_F_MTU);
76daa3
+    }
76daa3
+
76daa3
     virtio_net_set_multiqueue(n,
76daa3
                               virtio_has_feature(features, VIRTIO_NET_F_MQ));
76daa3
 
76daa3
@@ -2090,6 +2103,8 @@ static Property virtio_net_properties[] = {
76daa3
     DEFINE_PROP_UINT16("rx_queue_size", VirtIONet, net_conf.rx_queue_size,
76daa3
                        VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE),
76daa3
     DEFINE_PROP_UINT16("host_mtu", VirtIONet, net_conf.mtu, 0),
76daa3
+    DEFINE_PROP_BOOL("x-mtu-bypass-backend", VirtIONet, mtu_bypass_backend,
76daa3
+                     true),
76daa3
     DEFINE_PROP_END_OF_LIST(),
76daa3
 };
76daa3
 
76daa3
diff --git a/include/hw/compat.h b/include/hw/compat.h
76daa3
index 8366acc..843958b 100644
76daa3
--- a/include/hw/compat.h
76daa3
+++ b/include/hw/compat.h
76daa3
@@ -360,6 +360,10 @@
76daa3
         .driver   = "e1000e",\
76daa3
         .property = "__redhat_e1000e_7_3_intr_state",\
76daa3
         .value    = "on",\
76daa3
+    },{ /* HW_COMPAT_RHEL7_3 */ \
76daa3
+        .driver   = "virtio-net-device",\
76daa3
+        .property = "x-mtu-bypass-backend",\
76daa3
+        .value    = "off",\
76daa3
     },
76daa3
 
76daa3
 #endif /* HW_COMPAT_H */
76daa3
diff --git a/include/hw/virtio/virtio-net.h b/include/hw/virtio/virtio-net.h
76daa3
index 1eec9a2..602b486 100644
76daa3
--- a/include/hw/virtio/virtio-net.h
76daa3
+++ b/include/hw/virtio/virtio-net.h
76daa3
@@ -97,6 +97,7 @@ typedef struct VirtIONet {
76daa3
     QEMUTimer *announce_timer;
76daa3
     int announce_counter;
76daa3
     bool needs_vnet_hdr_swap;
76daa3
+    bool mtu_bypass_backend;
76daa3
 } VirtIONet;
76daa3
 
76daa3
 void virtio_net_set_netclient_name(VirtIONet *n, const char *name,
76daa3
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
76daa3
index 7dcb53a..5faa359 100644
76daa3
--- a/include/hw/virtio/virtio.h
76daa3
+++ b/include/hw/virtio/virtio.h
76daa3
@@ -79,6 +79,7 @@ struct VirtIODevice
76daa3
     uint16_t queue_sel;
76daa3
     uint64_t guest_features;
76daa3
     uint64_t host_features;
76daa3
+    uint64_t backend_features;
76daa3
     size_t config_len;
76daa3
     void *config;
76daa3
     uint16_t config_vector;
76daa3
-- 
76daa3
1.8.3.1
76daa3