[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL V2 07/10] vmnet: stop recieving events when VM is stopped
From: |
Jason Wang |
Subject: |
[PULL V2 07/10] vmnet: stop recieving events when VM is stopped |
Date: |
Thu, 16 Feb 2023 13:24:21 +0800 |
From: Joelle van Dyne <j@getutm.app>
When the VM is stopped using the HMP command "stop", soon the handler will
stop reading from the vmnet interface. This causes a flood of
`VMNET_INTERFACE_PACKETS_AVAILABLE` events to arrive and puts the host CPU
at 100%. We fix this by removing the event handler from vmnet when the VM
is no longer in a running state and restore it when we return to a running
state.
Signed-off-by: Joelle van Dyne <j@getutm.app>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
net/vmnet-common.m | 48 +++++++++++++++++++++++++++++++++++-------------
net/vmnet_int.h | 2 ++
2 files changed, 37 insertions(+), 13 deletions(-)
diff --git a/net/vmnet-common.m b/net/vmnet-common.m
index 2cb60b9..2958283 100644
--- a/net/vmnet-common.m
+++ b/net/vmnet-common.m
@@ -17,6 +17,7 @@
#include "clients.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
+#include "sysemu/runstate.h"
#include <vmnet/vmnet.h>
#include <dispatch/dispatch.h>
@@ -242,6 +243,35 @@ static void vmnet_bufs_init(VmnetState *s)
}
}
+/**
+ * Called on state change to un-register/re-register handlers
+ */
+static void vmnet_vm_state_change_cb(void *opaque, bool running, RunState
state)
+{
+ VmnetState *s = opaque;
+
+ if (running) {
+ vmnet_interface_set_event_callback(
+ s->vmnet_if,
+ VMNET_INTERFACE_PACKETS_AVAILABLE,
+ s->if_queue,
+ ^(interface_event_t event_id, xpc_object_t event) {
+ assert(event_id == VMNET_INTERFACE_PACKETS_AVAILABLE);
+ /*
+ * This function is being called from a non qemu thread, so
+ * we only schedule a BH, and do the rest of the io completion
+ * handling from vmnet_send_bh() which runs in a qemu context.
+ */
+ qemu_bh_schedule(s->send_bh);
+ });
+ } else {
+ vmnet_interface_set_event_callback(
+ s->vmnet_if,
+ VMNET_INTERFACE_PACKETS_AVAILABLE,
+ NULL,
+ NULL);
+ }
+}
int vmnet_if_create(NetClientState *nc,
xpc_object_t if_desc,
@@ -329,19 +359,9 @@ int vmnet_if_create(NetClientState *nc,
s->packets_send_current_pos = 0;
s->packets_send_end_pos = 0;
- vmnet_interface_set_event_callback(
- s->vmnet_if,
- VMNET_INTERFACE_PACKETS_AVAILABLE,
- s->if_queue,
- ^(interface_event_t event_id, xpc_object_t event) {
- assert(event_id == VMNET_INTERFACE_PACKETS_AVAILABLE);
- /*
- * This function is being called from a non qemu thread, so
- * we only schedule a BH, and do the rest of the io completion
- * handling from vmnet_send_bh() which runs in a qemu context.
- */
- qemu_bh_schedule(s->send_bh);
- });
+ vmnet_vm_state_change_cb(s, 1, RUN_STATE_RUNNING);
+
+ s->change = qemu_add_vm_change_state_handler(vmnet_vm_state_change_cb, s);
return 0;
}
@@ -356,6 +376,8 @@ void vmnet_cleanup_common(NetClientState *nc)
return;
}
+ vmnet_vm_state_change_cb(s, 0, RUN_STATE_SHUTDOWN);
+ qemu_del_vm_change_state_handler(s->change);
if_stopped_sem = dispatch_semaphore_create(0);
vmnet_stop_interface(
s->vmnet_if,
diff --git a/net/vmnet_int.h b/net/vmnet_int.h
index d0b9059..a8a033d 100644
--- a/net/vmnet_int.h
+++ b/net/vmnet_int.h
@@ -45,6 +45,8 @@ typedef struct VmnetState {
int packets_send_end_pos;
struct iovec iov_buf[VMNET_PACKETS_LIMIT];
+
+ VMChangeStateEntry *change;
} VmnetState;
const char *vmnet_status_map_str(vmnet_return_t status);
--
2.7.4
- [PULL V2 00/10] Net patches, Jason Wang, 2023/02/16
- [PULL V2 02/10] net: Restore printing of the help text with "-nic help", Jason Wang, 2023/02/16
- [PULL V2 01/10] net: Move the code to collect available NIC models to a separate function, Jason Wang, 2023/02/16
- [PULL V2 05/10] hw/net/vmxnet3: allow VMXNET3_MAX_MTU itself as a value, Jason Wang, 2023/02/16
- [PULL V2 03/10] net: Replace "Supported NIC models" with "Available NIC models", Jason Wang, 2023/02/16
- [PULL V2 06/10] net: Increase L2TPv3 buffer to fit jumboframes, Jason Wang, 2023/02/16
- [PULL V2 04/10] hw/net/lan9118: log [read|write]b when mode_16bit is enabled rather than abort, Jason Wang, 2023/02/16
- [PULL V2 07/10] vmnet: stop recieving events when VM is stopped,
Jason Wang <=
- [PULL V2 08/10] hw/net/can/xlnx-zynqmp-can: fix assertion failures in transfer_fifo(), Jason Wang, 2023/02/16
- [PULL V2 10/10] vdpa: fix VHOST_BACKEND_F_IOTLB_ASID flag check, Jason Wang, 2023/02/16
- [PULL V2 09/10] net: stream: add a new option to automatically reconnect, Jason Wang, 2023/02/16
- Re: [PULL V2 00/10] Net patches, Philippe Mathieu-Daudé, 2023/02/16