[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v8 10/19] virtio-net: Return an error when vhost cannot enable RS
From: |
Akihiko Odaki |
Subject: |
[PATCH v8 10/19] virtio-net: Return an error when vhost cannot enable RSS |
Date: |
Sun, 10 Dec 2023 14:29:48 +0900 |
vhost requires eBPF for RSS. When eBPF is not available, virtio-net
implicitly disables RSS even if the user explicitly requests it. Return
an error instead of implicitly disabling RSS if RSS is requested but not
available.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
hw/net/virtio-net.c | 98 ++++++++++++++++++++++++++---------------------------
1 file changed, 49 insertions(+), 49 deletions(-)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 5d4afd12b2..c2cbf39a5f 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -792,9 +792,6 @@ static uint64_t virtio_net_get_features(VirtIODevice *vdev,
uint64_t features,
return features;
}
- if (!ebpf_rss_is_loaded(&n->ebpf_rss)) {
- virtio_clear_feature(&features, VIRTIO_NET_F_RSS);
- }
features = vhost_net_get_features(get_vhost_net(nc->peer), features);
vdev->backend_features = features;
@@ -3533,6 +3530,50 @@ static bool failover_hide_primary_device(DeviceListener
*listener,
return qatomic_read(&n->failover_primary_hidden);
}
+static void virtio_net_device_unrealize(DeviceState *dev)
+{
+ VirtIODevice *vdev = VIRTIO_DEVICE(dev);
+ VirtIONet *n = VIRTIO_NET(dev);
+ int i, max_queue_pairs;
+
+ if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) {
+ virtio_net_unload_ebpf(n);
+ }
+
+ /* This will stop vhost backend if appropriate. */
+ virtio_net_set_status(vdev, 0);
+
+ g_free(n->netclient_name);
+ n->netclient_name = NULL;
+ g_free(n->netclient_type);
+ n->netclient_type = NULL;
+
+ g_free(n->mac_table.macs);
+ g_free(n->vlans);
+
+ if (n->failover) {
+ qobject_unref(n->primary_opts);
+ device_listener_unregister(&n->primary_listener);
+ migration_remove_notifier(&n->migration_state);
+ } else {
+ assert(n->primary_opts == NULL);
+ }
+
+ max_queue_pairs = n->multiqueue ? n->max_queue_pairs : 1;
+ for (i = 0; i < max_queue_pairs; i++) {
+ virtio_net_del_queue(n, i);
+ }
+ /* delete also control vq */
+ virtio_del_queue(vdev, max_queue_pairs * 2);
+ qemu_announce_timer_del(&n->announce_timer, false);
+ g_free(n->vqs);
+ qemu_del_nic(n->nic);
+ virtio_net_rsc_cleanup(n);
+ g_free(n->rss_data.indirections_table);
+ net_rx_pkt_uninit(n->rx_pkt);
+ virtio_cleanup(vdev);
+}
+
static void virtio_net_device_realize(DeviceState *dev, Error **errp)
{
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
@@ -3704,53 +3745,12 @@ static void virtio_net_device_realize(DeviceState *dev,
Error **errp)
net_rx_pkt_init(&n->rx_pkt);
- if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) {
- virtio_net_load_ebpf(n);
- }
-}
-
-static void virtio_net_device_unrealize(DeviceState *dev)
-{
- VirtIODevice *vdev = VIRTIO_DEVICE(dev);
- VirtIONet *n = VIRTIO_NET(dev);
- int i, max_queue_pairs;
-
- if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) {
- virtio_net_unload_ebpf(n);
+ if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS) &&
+ !virtio_net_load_ebpf(n) &&
+ get_vhost_net(nc->peer)) {
+ error_setg(errp, "Can't load eBPF RSS for vhost");
+ virtio_net_device_unrealize(dev);
}
-
- /* This will stop vhost backend if appropriate. */
- virtio_net_set_status(vdev, 0);
-
- g_free(n->netclient_name);
- n->netclient_name = NULL;
- g_free(n->netclient_type);
- n->netclient_type = NULL;
-
- g_free(n->mac_table.macs);
- g_free(n->vlans);
-
- if (n->failover) {
- qobject_unref(n->primary_opts);
- device_listener_unregister(&n->primary_listener);
- migration_remove_notifier(&n->migration_state);
- } else {
- assert(n->primary_opts == NULL);
- }
-
- max_queue_pairs = n->multiqueue ? n->max_queue_pairs : 1;
- for (i = 0; i < max_queue_pairs; i++) {
- virtio_net_del_queue(n, i);
- }
- /* delete also control vq */
- virtio_del_queue(vdev, max_queue_pairs * 2);
- qemu_announce_timer_del(&n->announce_timer, false);
- g_free(n->vqs);
- qemu_del_nic(n->nic);
- virtio_net_rsc_cleanup(n);
- g_free(n->rss_data.indirections_table);
- net_rx_pkt_uninit(n->rx_pkt);
- virtio_cleanup(vdev);
}
static void virtio_net_reset(VirtIODevice *vdev)
--
2.43.0
- [PATCH v8 00/19] virtio-net RSS/hash report fixes and improvements, Akihiko Odaki, 2023/12/10
- [PATCH v8 01/19] tap: Remove tap_probe_vnet_hdr_len(), Akihiko Odaki, 2023/12/10
- [PATCH v8 02/19] tap: Remove qemu_using_vnet_hdr(), Akihiko Odaki, 2023/12/10
- [PATCH v8 03/19] net: Move virtio-net header length assertion, Akihiko Odaki, 2023/12/10
- [PATCH v8 05/19] tap: Call tap_receive_iov() from tap_receive(), Akihiko Odaki, 2023/12/10
- [PATCH v8 04/19] net: Remove receive_raw(), Akihiko Odaki, 2023/12/10
- [PATCH v8 06/19] tap: Shrink zeroed virtio-net header, Akihiko Odaki, 2023/12/10
- [PATCH v8 07/19] virtio-net: Copy header only when necessary, Akihiko Odaki, 2023/12/10
- [PATCH v8 08/19] virtio-net: Disable RSS on reset, Akihiko Odaki, 2023/12/10
- [PATCH v8 09/19] virtio-net: Unify the logic to update NIC state for RSS, Akihiko Odaki, 2023/12/10
- [PATCH v8 10/19] virtio-net: Return an error when vhost cannot enable RSS,
Akihiko Odaki <=
- [PATCH v8 12/19] virtio-net: Always set populate_hash, Akihiko Odaki, 2023/12/10
- [PATCH v8 13/19] virtio-net: Do not write hashes to peer buffer, Akihiko Odaki, 2023/12/10
- [PATCH v8 14/19] ebpf: Fix RSS error handling, Akihiko Odaki, 2023/12/10
- [PATCH v8 11/19] virtio-net: Report RSS warning at device realization, Akihiko Odaki, 2023/12/10
- [PATCH v8 16/19] ebpf: Simplify error handling, Akihiko Odaki, 2023/12/10
- [PATCH v8 15/19] ebpf: Use standard section name, Akihiko Odaki, 2023/12/10
- [PATCH v8 18/19] ebpf: Refactor tun_rss_steering_prog(), Akihiko Odaki, 2023/12/10
- [PATCH v8 19/19] ebpf: Add a separate target for skeleton, Akihiko Odaki, 2023/12/10
- [PATCH v8 17/19] ebpf: Return 0 when configuration fails, Akihiko Odaki, 2023/12/10
- Re: [PATCH v8 00/19] virtio-net RSS/hash report fixes and improvements, Yuri Benditovich, 2023/12/11