[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v8 09/19] virtio-net: Unify the logic to update NIC state for RSS
From: |
Akihiko Odaki |
Subject: |
[PATCH v8 09/19] virtio-net: Unify the logic to update NIC state for RSS |
Date: |
Sun, 10 Dec 2023 14:29:47 +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 4c528baad9..5d4afd12b2 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -1231,18 +1231,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);
@@ -1290,6 +1278,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(VirtIONet *n)
{
if (!virtio_net_attach_ebpf_to_backend(n->nic, -1)) {
@@ -1418,28 +1440,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);
@@ -3035,26 +3036,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.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 <=
- [PATCH v8 10/19] virtio-net: Return an error when vhost cannot enable RSS, Akihiko Odaki, 2023/12/10
- [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