[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 12/20] virtio-net: Unify the logic to update NIC state for RSS
From: |
Jason Wang |
Subject: |
[PULL 12/20] virtio-net: Unify the logic to update NIC state for RSS |
Date: |
Tue, 4 Jun 2024 15:37:47 +0800 |
From: Akihiko Odaki <akihiko.odaki@daynix.com>
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>
Signed-off-by: Jason Wang <jasowang@redhat.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 345ef9a8fd..8464eb4082 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);
@@ -3076,26 +3077,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.42.0
- [PULL 07/20] virtio-net: Do not propagate ebpf-rss-fds errors, (continued)
- [PULL 07/20] virtio-net: Do not propagate ebpf-rss-fds errors, Jason Wang, 2024/06/04
- Re: [PULL 07/20] virtio-net: Do not propagate ebpf-rss-fds errors, Daniel P . Berrangé, 2024/06/05
- Re: [PULL 07/20] virtio-net: Do not propagate ebpf-rss-fds errors, Akihiko Odaki, 2024/06/05
- Re: [PULL 07/20] virtio-net: Do not propagate ebpf-rss-fds errors, Daniel P . Berrangé, 2024/06/06
- Re: [PULL 07/20] virtio-net: Do not propagate ebpf-rss-fds errors, Akihiko Odaki, 2024/06/06
- Re: [PULL 07/20] virtio-net: Do not propagate ebpf-rss-fds errors, Daniel P . Berrangé, 2024/06/06
- Re: [PULL 07/20] virtio-net: Do not propagate ebpf-rss-fds errors, Akihiko Odaki, 2024/06/07
[PULL 08/20] virtio-net: Add only one queue pair when realizing, Jason Wang, 2024/06/04
[PULL 09/20] virtio-net: Copy header only when necessary, Jason Wang, 2024/06/04
[PULL 10/20] virtio-net: Shrink header byte swapping buffer, Jason Wang, 2024/06/04
[PULL 12/20] virtio-net: Unify the logic to update NIC state for RSS,
Jason Wang <=
[PULL 11/20] virtio-net: Disable RSS on reset, Jason Wang, 2024/06/04
[PULL 13/20] virtio-net: Always set populate_hash, Jason Wang, 2024/06/04
[PULL 14/20] virtio-net: Do not write hashes to peer buffer, Jason Wang, 2024/06/04
[PULL 15/20] ebpf: Fix RSS error handling, Jason Wang, 2024/06/04
[PULL 16/20] ebpf: Return 0 when configuration fails, Jason Wang, 2024/06/04
[PULL 18/20] ebpf: Add a separate target for skeleton, Jason Wang, 2024/06/04
[PULL 17/20] ebpf: Refactor tun_rss_steering_prog(), Jason Wang, 2024/06/04
[PULL 19/20] virtio-net: drop too short packets early, Jason Wang, 2024/06/04
[PULL 20/20] ebpf: Added traces back. Changed source set for eBPF to 'system'., Jason Wang, 2024/06/04
[PULL 02/20] tap: Remove qemu_using_vnet_hdr(), Jason Wang, 2024/06/04