- kvm-rbd-Run-co-BH-CB-in-the-coroutine-s-AioContext.patch [RHEL-79118] - kvm-curl-Fix-coroutine-waking.patch [RHEL-79118] - kvm-block-io-Take-reqs_lock-for-tracked_requests.patch [RHEL-79118] - kvm-qcow2-Re-initialize-lock-in-invalidate_cache.patch [RHEL-79118] - kvm-qcow2-Fix-cache_clean_timer.patch [RHEL-79118] - kvm-net-bundle-all-offloads-in-a-single-struct.patch [RHEL-143785] - kvm-linux-headers-deal-with-counted_by-annotation.patch [RHEL-143785] - kvm-linux-headers-Update-to-Linux-v6.17-rc1.patch [RHEL-143785] - kvm-virtio-introduce-extended-features-type.patch [RHEL-143785] - kvm-virtio-serialize-extended-features-state.patch [RHEL-143785] - kvm-virtio-add-support-for-negotiating-extended-features.patch [RHEL-143785] - kvm-virtio-pci-implement-support-for-extended-features.patch [RHEL-143785] - kvm-vhost-add-support-for-negotiating-extended-features.patch [RHEL-143785] - kvm-qmp-update-virtio-features-map-to-support-extended-f.patch [RHEL-143785] - kvm-vhost-backend-implement-extended-features-support.patch [RHEL-143785] - kvm-vhost-net-implement-extended-features-support.patch [RHEL-143785] - kvm-virtio-net-implement-extended-features-support.patch [RHEL-143785] - kvm-net-implement-tunnel-probing.patch [RHEL-143785] - kvm-net-implement-UDP-tunnel-features-offloading.patch [RHEL-143785] - Resolves: RHEL-79118 ([network-storage][rbd][core-dump]installation of guest failed sometimes with multiqueue enabled [rhel10]) - Resolves: RHEL-143785 (backport support for GSO over UDP tunnel offload)
238 lines
9.0 KiB
Diff
238 lines
9.0 KiB
Diff
From 7eb0a4d5d5a03fd631b87c59dc531080f93a0640 Mon Sep 17 00:00:00 2001
|
|
From: Paolo Abeni <pabeni@redhat.com>
|
|
Date: Mon, 22 Sep 2025 16:18:25 +0200
|
|
Subject: [PATCH 16/19] vhost-net: implement extended features support
|
|
|
|
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
|
RH-MergeRequest: 456: backport support for GSO over UDP tunnel offload
|
|
RH-Jira: RHEL-143785
|
|
RH-Acked-by: Cindy Lu <lulu@redhat.com>
|
|
RH-Acked-by: MST <mst@redhat.com>
|
|
RH-Commit: [11/14] 48cf0458bd30eeca10dace74ca2a8871dc0c8bca (lvivier/qemu-kvm-centos)
|
|
|
|
JIRA: https://issues.redhat.com/browse/RHEL-143785
|
|
|
|
Provide extended version of the features manipulation helpers,
|
|
and let the device initialization deal with the full features space,
|
|
adjusting the relevant format strings accordingly.
|
|
|
|
Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
|
|
Acked-by: Jason Wang <jasowang@redhat.com>
|
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|
Tested-by: Lei Yang <leiyang@redhat.com>
|
|
Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Message-ID: <69c78c432e28e146a8874b2a7d00e9cbd111b1ba.1758549625.git.pabeni@redhat.com>
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
(cherry picked from commit d55ad8c9a9a5edd8152f13fc97879d66972f103e)
|
|
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
|
---
|
|
hw/net/vhost_net-stub.c | 8 +++-----
|
|
hw/net/vhost_net.c | 45 +++++++++++++++++++++++------------------
|
|
include/net/vhost_net.h | 33 +++++++++++++++++++++++++++---
|
|
3 files changed, 58 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/hw/net/vhost_net-stub.c b/hw/net/vhost_net-stub.c
|
|
index 7d49f82906..0740d5a2eb 100644
|
|
--- a/hw/net/vhost_net-stub.c
|
|
+++ b/hw/net/vhost_net-stub.c
|
|
@@ -46,9 +46,8 @@ void vhost_net_cleanup(struct vhost_net *net)
|
|
{
|
|
}
|
|
|
|
-uint64_t vhost_net_get_features(struct vhost_net *net, uint64_t features)
|
|
+void vhost_net_get_features_ex(struct vhost_net *net, uint64_t *features)
|
|
{
|
|
- return features;
|
|
}
|
|
|
|
int vhost_net_get_config(struct vhost_net *net, uint8_t *config,
|
|
@@ -62,13 +61,12 @@ int vhost_net_set_config(struct vhost_net *net, const uint8_t *data,
|
|
return 0;
|
|
}
|
|
|
|
-void vhost_net_ack_features(struct vhost_net *net, uint64_t features)
|
|
+void vhost_net_ack_features_ex(struct vhost_net *net, const uint64_t *features)
|
|
{
|
|
}
|
|
|
|
-uint64_t vhost_net_get_acked_features(VHostNetState *net)
|
|
+void vhost_net_get_acked_features_ex(VHostNetState *net, uint64_t *features)
|
|
{
|
|
- return 0;
|
|
}
|
|
|
|
bool vhost_net_virtqueue_pending(VHostNetState *net, int idx)
|
|
diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
|
|
index 540492b37d..a8ee18a912 100644
|
|
--- a/hw/net/vhost_net.c
|
|
+++ b/hw/net/vhost_net.c
|
|
@@ -35,10 +35,9 @@
|
|
#include "hw/virtio/virtio-bus.h"
|
|
#include "linux-headers/linux/vhost.h"
|
|
|
|
-uint64_t vhost_net_get_features(struct vhost_net *net, uint64_t features)
|
|
+void vhost_net_get_features_ex(struct vhost_net *net, uint64_t *features)
|
|
{
|
|
- return vhost_get_features(&net->dev, net->feature_bits,
|
|
- features);
|
|
+ vhost_get_features_ex(&net->dev, net->feature_bits, features);
|
|
}
|
|
int vhost_net_get_config(struct vhost_net *net, uint8_t *config,
|
|
uint32_t config_len)
|
|
@@ -51,10 +50,11 @@ int vhost_net_set_config(struct vhost_net *net, const uint8_t *data,
|
|
return vhost_dev_set_config(&net->dev, data, offset, size, flags);
|
|
}
|
|
|
|
-void vhost_net_ack_features(struct vhost_net *net, uint64_t features)
|
|
+void vhost_net_ack_features_ex(struct vhost_net *net, const uint64_t *features)
|
|
{
|
|
- net->dev.acked_features = net->dev.backend_features;
|
|
- vhost_ack_features(&net->dev, net->feature_bits, features);
|
|
+ virtio_features_copy(net->dev.acked_features_ex,
|
|
+ net->dev.backend_features_ex);
|
|
+ vhost_ack_features_ex(&net->dev, net->feature_bits, features);
|
|
}
|
|
|
|
uint64_t vhost_net_get_max_queues(VHostNetState *net)
|
|
@@ -62,9 +62,9 @@ uint64_t vhost_net_get_max_queues(VHostNetState *net)
|
|
return net->dev.max_queues;
|
|
}
|
|
|
|
-uint64_t vhost_net_get_acked_features(VHostNetState *net)
|
|
+void vhost_net_get_acked_features_ex(VHostNetState *net, uint64_t *features)
|
|
{
|
|
- return net->dev.acked_features;
|
|
+ virtio_features_copy(features, net->dev.acked_features_ex);
|
|
}
|
|
|
|
void vhost_net_save_acked_features(NetClientState *nc)
|
|
@@ -234,7 +234,8 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
|
|
int r;
|
|
bool backend_kernel = options->backend_type == VHOST_BACKEND_TYPE_KERNEL;
|
|
struct vhost_net *net = g_new0(struct vhost_net, 1);
|
|
- uint64_t features = 0;
|
|
+ uint64_t missing_features[VIRTIO_FEATURES_NU64S];
|
|
+ uint64_t features[VIRTIO_FEATURES_NU64S];
|
|
Error *local_err = NULL;
|
|
|
|
if (!options->net_backend) {
|
|
@@ -247,6 +248,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
|
|
net->save_acked_features = options->save_acked_features;
|
|
net->max_tx_queue_size = options->max_tx_queue_size;
|
|
net->is_vhost_user = options->is_vhost_user;
|
|
+ virtio_features_clear(features);
|
|
|
|
net->dev.max_queues = 1;
|
|
net->dev.vqs = net->vqs;
|
|
@@ -261,7 +263,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
|
|
net->backend = r;
|
|
net->dev.protocol_features = 0;
|
|
} else {
|
|
- net->dev.backend_features = 0;
|
|
+ virtio_features_clear(net->dev.backend_features_ex);
|
|
net->dev.protocol_features = 0;
|
|
net->backend = -1;
|
|
|
|
@@ -281,26 +283,29 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
|
|
sizeof(struct virtio_net_hdr_mrg_rxbuf))) {
|
|
net->dev.features &= ~(1ULL << VIRTIO_NET_F_MRG_RXBUF);
|
|
}
|
|
- if (~net->dev.features & net->dev.backend_features) {
|
|
- fprintf(stderr, "vhost lacks feature mask 0x%" PRIx64
|
|
- " for backend\n",
|
|
- (uint64_t)(~net->dev.features & net->dev.backend_features));
|
|
+
|
|
+ if (virtio_features_andnot(missing_features,
|
|
+ net->dev.backend_features_ex,
|
|
+ net->dev.features_ex)) {
|
|
+ fprintf(stderr, "vhost lacks feature mask 0x" VIRTIO_FEATURES_FMT
|
|
+ " for backend\n", VIRTIO_FEATURES_PR(missing_features));
|
|
goto fail;
|
|
}
|
|
}
|
|
|
|
/* Set sane init value. Override when guest acks. */
|
|
if (options->get_acked_features) {
|
|
- features = options->get_acked_features(net->nc);
|
|
- if (~net->dev.features & features) {
|
|
- fprintf(stderr, "vhost lacks feature mask 0x%" PRIx64
|
|
- " for backend\n",
|
|
- (uint64_t)(~net->dev.features & features));
|
|
+ virtio_features_from_u64(features,
|
|
+ options->get_acked_features(net->nc));
|
|
+ if (virtio_features_andnot(missing_features, features,
|
|
+ net->dev.features_ex)) {
|
|
+ fprintf(stderr, "vhost lacks feature mask 0x" VIRTIO_FEATURES_FMT
|
|
+ " for backend\n", VIRTIO_FEATURES_PR(missing_features));
|
|
goto fail;
|
|
}
|
|
}
|
|
|
|
- vhost_net_ack_features(net, features);
|
|
+ vhost_net_ack_features_ex(net, features);
|
|
|
|
return net;
|
|
|
|
diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h
|
|
index 879781dad7..0225207491 100644
|
|
--- a/include/net/vhost_net.h
|
|
+++ b/include/net/vhost_net.h
|
|
@@ -2,6 +2,7 @@
|
|
#define VHOST_NET_H
|
|
|
|
#include "net/net.h"
|
|
+#include "hw/virtio/virtio-features.h"
|
|
#include "hw/virtio/vhost-backend.h"
|
|
|
|
struct vhost_net;
|
|
@@ -33,8 +34,26 @@ void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs,
|
|
|
|
void vhost_net_cleanup(VHostNetState *net);
|
|
|
|
-uint64_t vhost_net_get_features(VHostNetState *net, uint64_t features);
|
|
-void vhost_net_ack_features(VHostNetState *net, uint64_t features);
|
|
+void vhost_net_get_features_ex(VHostNetState *net, uint64_t *features);
|
|
+static inline uint64_t vhost_net_get_features(VHostNetState *net,
|
|
+ uint64_t features)
|
|
+{
|
|
+ uint64_t features_array[VIRTIO_FEATURES_NU64S];
|
|
+
|
|
+ virtio_features_from_u64(features_array, features);
|
|
+ vhost_net_get_features_ex(net, features_array);
|
|
+ return features_array[0];
|
|
+}
|
|
+
|
|
+void vhost_net_ack_features_ex(VHostNetState *net, const uint64_t *features);
|
|
+static inline void vhost_net_ack_features(VHostNetState *net,
|
|
+ uint64_t features)
|
|
+{
|
|
+ uint64_t features_array[VIRTIO_FEATURES_NU64S];
|
|
+
|
|
+ virtio_features_from_u64(features_array, features);
|
|
+ vhost_net_ack_features_ex(net, features_array);
|
|
+}
|
|
|
|
int vhost_net_get_config(struct vhost_net *net, uint8_t *config,
|
|
uint32_t config_len);
|
|
@@ -51,7 +70,15 @@ VHostNetState *get_vhost_net(NetClientState *nc);
|
|
|
|
int vhost_net_set_vring_enable(NetClientState *nc, int enable);
|
|
|
|
-uint64_t vhost_net_get_acked_features(VHostNetState *net);
|
|
+void vhost_net_get_acked_features_ex(VHostNetState *net, uint64_t *features);
|
|
+static inline uint64_t vhost_net_get_acked_features(VHostNetState *net)
|
|
+{
|
|
+ uint64_t features[VIRTIO_FEATURES_NU64S];
|
|
+
|
|
+ vhost_net_get_acked_features_ex(net, features);
|
|
+ assert(!virtio_features_use_ex(features));
|
|
+ return features[0];
|
|
+}
|
|
|
|
int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu);
|
|
|
|
--
|
|
2.47.3
|
|
|