[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v9 12/20] virtio-net: Unify the logic to update NIC state for RSS
From: |
Akihiko Odaki |
Subject: |
[PATCH v9 12/20] virtio-net: Unify the logic to update NIC state for RSS |
Date: |
Wed, 03 Apr 2024 20:11:00 +0900 |
The code to attach or detach the eBPF program to RSS were duplicated so
unify them into one function to save some code.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
hw/net/virtio-net.c | 90 +++++++++++++++++++++--------------------------------
1 file changed, 36 insertions(+), 54 deletions(-)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 1ac9c06f6865..61b49e335dea 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -1232,18 +1232,6 @@ static int virtio_net_handle_announce(VirtIONet *n,
uint8_t cmd,
}
}
-static void virtio_net_detach_epbf_rss(VirtIONet *n);
-
-static void virtio_net_disable_rss(VirtIONet *n)
-{
- if (n->rss_data.enabled) {
- trace_virtio_net_rss_disable();
- }
- n->rss_data.enabled = false;
-
- virtio_net_detach_epbf_rss(n);
-}
-
static bool virtio_net_attach_ebpf_to_backend(NICState *nic, int prog_fd)
{
NetClientState *nc = qemu_get_peer(qemu_get_queue(nic), 0);
@@ -1291,6 +1279,40 @@ static void virtio_net_detach_epbf_rss(VirtIONet *n)
virtio_net_attach_ebpf_to_backend(n->nic, -1);
}
+static void virtio_net_commit_rss_config(VirtIONet *n)
+{
+ if (n->rss_data.enabled) {
+ n->rss_data.enabled_software_rss = n->rss_data.populate_hash;
+ if (n->rss_data.populate_hash) {
+ virtio_net_detach_epbf_rss(n);
+ } else if (!virtio_net_attach_epbf_rss(n)) {
+ if (get_vhost_net(qemu_get_queue(n->nic)->peer)) {
+ warn_report("Can't load eBPF RSS for vhost");
+ } else {
+ warn_report("Can't load eBPF RSS - fallback to software RSS");
+ n->rss_data.enabled_software_rss = true;
+ }
+ }
+
+ trace_virtio_net_rss_enable(n->rss_data.hash_types,
+ n->rss_data.indirections_len,
+ sizeof(n->rss_data.key));
+ } else {
+ virtio_net_detach_epbf_rss(n);
+ trace_virtio_net_rss_disable();
+ }
+}
+
+static void virtio_net_disable_rss(VirtIONet *n)
+{
+ if (!n->rss_data.enabled) {
+ return;
+ }
+
+ n->rss_data.enabled = false;
+ virtio_net_commit_rss_config(n);
+}
+
static bool virtio_net_load_ebpf_fds(VirtIONet *n)
{
int fds[EBPF_RSS_MAX_FDS] = { [0 ... EBPF_RSS_MAX_FDS - 1] = -1};
@@ -1455,28 +1477,7 @@ static uint16_t virtio_net_handle_rss(VirtIONet *n,
goto error;
}
n->rss_data.enabled = true;
-
- if (!n->rss_data.populate_hash) {
- if (!virtio_net_attach_epbf_rss(n)) {
- /* EBPF must be loaded for vhost */
- if (get_vhost_net(qemu_get_queue(n->nic)->peer)) {
- warn_report("Can't load eBPF RSS for vhost");
- goto error;
- }
- /* fallback to software RSS */
- warn_report("Can't load eBPF RSS - fallback to software RSS");
- n->rss_data.enabled_software_rss = true;
- }
- } else {
- /* use software RSS for hash populating */
- /* and detach eBPF if was loaded before */
- virtio_net_detach_epbf_rss(n);
- n->rss_data.enabled_software_rss = true;
- }
-
- trace_virtio_net_rss_enable(n->rss_data.hash_types,
- n->rss_data.indirections_len,
- temp.b);
+ virtio_net_commit_rss_config(n);
return queue_pairs;
error:
trace_virtio_net_rss_error(err_msg, err_value);
@@ -3092,26 +3093,7 @@ static int virtio_net_post_load_device(void *opaque, int
version_id)
}
}
- if (n->rss_data.enabled) {
- n->rss_data.enabled_software_rss = n->rss_data.populate_hash;
- if (!n->rss_data.populate_hash) {
- if (!virtio_net_attach_epbf_rss(n)) {
- if (get_vhost_net(qemu_get_queue(n->nic)->peer)) {
- warn_report("Can't post-load eBPF RSS for vhost");
- } else {
- warn_report("Can't post-load eBPF RSS - "
- "fallback to software RSS");
- n->rss_data.enabled_software_rss = true;
- }
- }
- }
-
- trace_virtio_net_rss_enable(n->rss_data.hash_types,
- n->rss_data.indirections_len,
- sizeof(n->rss_data.key));
- } else {
- trace_virtio_net_rss_disable();
- }
+ virtio_net_commit_rss_config(n);
return 0;
}
--
2.44.0
- [PATCH v9 02/20] tap: Remove qemu_using_vnet_hdr(), (continued)
- [PATCH v9 02/20] tap: Remove qemu_using_vnet_hdr(), Akihiko Odaki, 2024/04/03
- [PATCH v9 03/20] net: Move virtio-net header length assertion, Akihiko Odaki, 2024/04/03
- [PATCH v9 04/20] net: Remove receive_raw(), Akihiko Odaki, 2024/04/03
- [PATCH v9 05/20] tap: Call tap_receive_iov() from tap_receive(), Akihiko Odaki, 2024/04/03
- [PATCH v9 06/20] tap: Shrink zeroed virtio-net header, Akihiko Odaki, 2024/04/03
- [PATCH v9 07/20] virtio-net: Do not propagate ebpf-rss-fds errors, Akihiko Odaki, 2024/04/03
- [PATCH v9 09/20] virtio-net: Copy header only when necessary, Akihiko Odaki, 2024/04/03
- [PATCH v9 08/20] virtio-net: Add only one queue pair when realizing, Akihiko Odaki, 2024/04/03
- [PATCH v9 10/20] virtio-net: Shrink header byte swapping buffer, Akihiko Odaki, 2024/04/03
- [PATCH v9 11/20] virtio-net: Disable RSS on reset, Akihiko Odaki, 2024/04/03
- [PATCH v9 12/20] virtio-net: Unify the logic to update NIC state for RSS,
Akihiko Odaki <=
- [PATCH v9 13/20] virtio-net: Return an error when vhost cannot enable RSS, Akihiko Odaki, 2024/04/03
- Re: [PATCH v9 13/20] virtio-net: Return an error when vhost cannot enable RSS, Yuri Benditovich, 2024/04/15
- Re: [PATCH v9 13/20] virtio-net: Return an error when vhost cannot enable RSS, Jason Wang, 2024/04/16
- Re: [PATCH v9 13/20] virtio-net: Return an error when vhost cannot enable RSS, Yuri Benditovich, 2024/04/16
- Re: [PATCH v9 13/20] virtio-net: Return an error when vhost cannot enable RSS, Jason Wang, 2024/04/16
- Re: [PATCH v9 13/20] virtio-net: Return an error when vhost cannot enable RSS, Yuri Benditovich, 2024/04/16
- Re: [PATCH v9 13/20] virtio-net: Return an error when vhost cannot enable RSS, Jason Wang, 2024/04/17