|
|
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 |
|