- Add load average information type into virDomainGetGuestInfo (RHEL-88447) - qemu_agent: Add qemuAgentGetLoadAvg() (RHEL-88447) - qemu: Add support for VIR_DOMAIN_GUEST_INFO_LOAD (RHEL-88447) - virsh: Add support for VIR_DOMAIN_GUEST_INFO_LOAD (RHEL-88447) - qemu_capabilities: Fetch caps for virtio-mem-ccw too (RHEL-87532) - cpu_map: Add avx10* CPU features (RHEL-87796) - cpu_map: Add GraniteRapids-v2 CPU model (RHEL-87796) - cpu_map: Add sha512, sm3, and sm4 CPU features (RHEL-87796) - virsh: Introduce new hypervisor-cpu-models command (RHEL-11435) - qemu: remove nonsensical sanity check in processNetdevStreamDisconnectedEvent() (RHEL-80169) - qemu: make processNetDevStreamDisconnectedEvent() reusable (RHEL-80169) - qemu: respond to NETDEV_VHOST_USER_DISCONNECTED event (RHEL-80169) - qemu: put vhost-user code that's special for passt in a helper function (RHEL-80169) - qemu: make passt+vhostuser reconnect behave identically to passt+user (RHEL-80169) Resolves: RHEL-11435, RHEL-80169, RHEL-87532, RHEL-87796, RHEL-88447
225 lines
9.5 KiB
Diff
225 lines
9.5 KiB
Diff
From 1be043d47792afe408bef01a5c169dcd4e98e782 Mon Sep 17 00:00:00 2001
|
|
Message-ID: <1be043d47792afe408bef01a5c169dcd4e98e782.1747908718.git.jdenemar@redhat.com>
|
|
From: Laine Stump <laine@redhat.com>
|
|
Date: Fri, 4 Apr 2025 17:16:43 -0400
|
|
Subject: [PATCH] qemu: respond to NETDEV_VHOST_USER_DISCONNECTED event
|
|
|
|
This response to this event is identical to NETDEV_STREAM_DISCONNECTED
|
|
(start a new passt process to replace the one that just disappeared -
|
|
see commitf62ce81b8a5), except that the new passt process will have
|
|
"--vhost-user" appended to the commandline. Fortunately that
|
|
difference is already handled based on the virDomainNetDef contents,
|
|
so we can, in fact, respond to the new event in exactly the same
|
|
manner.
|
|
|
|
Signed-off-by: Laine Stump <laine@redhat.com>
|
|
Tested-by: Stefano Brivio <sbrivio@redhat.com>
|
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
|
(cherry picked from commit dedf1ada95f046310827194eb8794fa18975b9e7)
|
|
|
|
Conflicts:
|
|
|
|
src/qemu/qemu_driver.c:
|
|
In context surrounding a chunk, the arguments to
|
|
processNicRxFilterChangedEvent() changed upstream (due to upstream
|
|
commit 50981052a5f)
|
|
|
|
https://issues.redhat.com/browse/RHEL-80169
|
|
Signed-off-by: Laine Stump <laine@redhat.com>
|
|
---
|
|
src/qemu/qemu_domain.c | 1 +
|
|
src/qemu/qemu_domain.h | 1 +
|
|
src/qemu/qemu_driver.c | 11 +++++++++++
|
|
src/qemu/qemu_monitor.c | 11 +++++++++++
|
|
src/qemu/qemu_monitor.h | 6 ++++++
|
|
src/qemu/qemu_monitor_json.c | 16 ++++++++++++++++
|
|
src/qemu/qemu_process.c | 18 ++++++++++++++++++
|
|
7 files changed, 64 insertions(+)
|
|
|
|
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
|
index 4234e4605b..cc47adb724 100644
|
|
--- a/src/qemu/qemu_domain.c
|
|
+++ b/src/qemu/qemu_domain.c
|
|
@@ -10038,6 +10038,7 @@ qemuProcessEventFree(struct qemuProcessEvent *event)
|
|
case QEMU_PROCESS_EVENT_WATCHDOG:
|
|
case QEMU_PROCESS_EVENT_DEVICE_DELETED:
|
|
case QEMU_PROCESS_EVENT_NETDEV_STREAM_DISCONNECTED:
|
|
+ case QEMU_PROCESS_EVENT_NETDEV_VHOST_USER_DISCONNECTED:
|
|
case QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED:
|
|
case QEMU_PROCESS_EVENT_SERIAL_CHANGED:
|
|
case QEMU_PROCESS_EVENT_GUEST_CRASHLOADED:
|
|
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
|
index 6246988491..63f422bbcb 100644
|
|
--- a/src/qemu/qemu_domain.h
|
|
+++ b/src/qemu/qemu_domain.h
|
|
@@ -465,6 +465,7 @@ typedef enum {
|
|
QEMU_PROCESS_EVENT_GUESTPANIC,
|
|
QEMU_PROCESS_EVENT_DEVICE_DELETED,
|
|
QEMU_PROCESS_EVENT_NETDEV_STREAM_DISCONNECTED,
|
|
+ QEMU_PROCESS_EVENT_NETDEV_VHOST_USER_DISCONNECTED,
|
|
QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED,
|
|
QEMU_PROCESS_EVENT_SERIAL_CHANGED,
|
|
QEMU_PROCESS_EVENT_JOB_STATUS_CHANGE,
|
|
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
|
index 3373dfb845..b374b1978c 100644
|
|
--- a/src/qemu/qemu_driver.c
|
|
+++ b/src/qemu/qemu_driver.c
|
|
@@ -3691,6 +3691,14 @@ processNetdevStreamDisconnectedEvent(virDomainObj *vm,
|
|
}
|
|
|
|
|
|
+static void
|
|
+processNetdevVhostUserDisconnectedEvent(virDomainObj *vm,
|
|
+ const char *netdevId)
|
|
+{
|
|
+ processNetdevDisconnectedEvent(vm, netdevId, "NETDEV_VHOST_USER_DISCONNECTED");
|
|
+}
|
|
+
|
|
+
|
|
static void
|
|
processNicRxFilterChangedEvent(virDomainObj *vm,
|
|
const char *devAlias)
|
|
@@ -4089,6 +4097,9 @@ static void qemuProcessEventHandler(void *data, void *opaque)
|
|
case QEMU_PROCESS_EVENT_NETDEV_STREAM_DISCONNECTED:
|
|
processNetdevStreamDisconnectedEvent(vm, processEvent->data);
|
|
break;
|
|
+ case QEMU_PROCESS_EVENT_NETDEV_VHOST_USER_DISCONNECTED:
|
|
+ processNetdevVhostUserDisconnectedEvent(vm, processEvent->data);
|
|
+ break;
|
|
case QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED:
|
|
processNicRxFilterChangedEvent(vm, processEvent->data);
|
|
break;
|
|
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
|
|
index 82aa1cbc5f..ed63b7a29b 100644
|
|
--- a/src/qemu/qemu_monitor.c
|
|
+++ b/src/qemu/qemu_monitor.c
|
|
@@ -1267,6 +1267,17 @@ qemuMonitorEmitNetdevStreamDisconnected(qemuMonitor *mon,
|
|
}
|
|
|
|
|
|
+void
|
|
+qemuMonitorEmitNetdevVhostUserDisconnected(qemuMonitor *mon,
|
|
+ const char *devAlias)
|
|
+{
|
|
+ VIR_DEBUG("mon=%p", mon);
|
|
+
|
|
+ QEMU_MONITOR_CALLBACK(mon, domainNetdevVhostUserDisconnected,
|
|
+ mon->vm, devAlias);
|
|
+}
|
|
+
|
|
+
|
|
void
|
|
qemuMonitorEmitSerialChange(qemuMonitor *mon,
|
|
const char *devAlias,
|
|
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
|
|
index 672cd6487e..bcb39409ac 100644
|
|
--- a/src/qemu/qemu_monitor.h
|
|
+++ b/src/qemu/qemu_monitor.h
|
|
@@ -255,6 +255,9 @@ typedef void (*qemuMonitorDomainDeviceUnplugErrCallback)(qemuMonitor *mon,
|
|
typedef void (*qemuMonitorDomainNetdevStreamDisconnectedCallback)(qemuMonitor *mon,
|
|
virDomainObj *vm,
|
|
const char *devAlias);
|
|
+typedef void (*qemuMonitorDomainNetdevVhostUserDisconnectedCallback)(qemuMonitor *mon,
|
|
+ virDomainObj *vm,
|
|
+ const char *devAlias);
|
|
typedef void (*qemuMonitorDomainNicRxFilterChangedCallback)(qemuMonitor *mon,
|
|
virDomainObj *vm,
|
|
const char *devAlias);
|
|
@@ -403,6 +406,7 @@ struct _qemuMonitorCallbacks {
|
|
qemuMonitorDomainMemoryDeviceSizeChange domainMemoryDeviceSizeChange;
|
|
qemuMonitorDomainDeviceUnplugErrCallback domainDeviceUnplugError;
|
|
qemuMonitorDomainNetdevStreamDisconnectedCallback domainNetdevStreamDisconnected;
|
|
+ qemuMonitorDomainNetdevVhostUserDisconnectedCallback domainNetdevVhostUserDisconnected;
|
|
};
|
|
|
|
qemuMonitor *qemuMonitorOpen(virDomainObj *vm,
|
|
@@ -490,6 +494,8 @@ void qemuMonitorEmitDeviceUnplugErr(qemuMonitor *mon,
|
|
const char *devAlias);
|
|
void qemuMonitorEmitNetdevStreamDisconnected(qemuMonitor *mon,
|
|
const char *devAlias);
|
|
+void qemuMonitorEmitNetdevVhostUserDisconnected(qemuMonitor *mon,
|
|
+ const char *devAlias);
|
|
void qemuMonitorEmitNicRxFilterChanged(qemuMonitor *mon,
|
|
const char *devAlias);
|
|
void qemuMonitorEmitSerialChange(qemuMonitor *mon,
|
|
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
|
|
index 6f9f495888..be5d3be7e6 100644
|
|
--- a/src/qemu/qemu_monitor_json.c
|
|
+++ b/src/qemu/qemu_monitor_json.c
|
|
@@ -85,6 +85,7 @@ static void qemuMonitorJSONHandleMemoryFailure(qemuMonitor *mon, virJSONValue *d
|
|
static void qemuMonitorJSONHandleMemoryDeviceSizeChange(qemuMonitor *mon, virJSONValue *data);
|
|
static void qemuMonitorJSONHandleDeviceUnplugErr(qemuMonitor *mon, virJSONValue *data);
|
|
static void qemuMonitorJSONHandleNetdevStreamDisconnected(qemuMonitor *mon, virJSONValue *data);
|
|
+static void qemuMonitorJSONHandleNetdevVhostUserDisconnected(qemuMonitor *mon, virJSONValue *data);
|
|
|
|
typedef struct {
|
|
const char *type;
|
|
@@ -108,6 +109,7 @@ static qemuEventHandler eventHandlers[] = {
|
|
{ "MIGRATION", qemuMonitorJSONHandleMigrationStatus, },
|
|
{ "MIGRATION_PASS", qemuMonitorJSONHandleMigrationPass, },
|
|
{ "NETDEV_STREAM_DISCONNECTED", qemuMonitorJSONHandleNetdevStreamDisconnected, },
|
|
+ { "NETDEV_VHOST_USER_DISCONNECTED", qemuMonitorJSONHandleNetdevVhostUserDisconnected, },
|
|
{ "NIC_RX_FILTER_CHANGED", qemuMonitorJSONHandleNicRxFilterChanged, },
|
|
{ "PR_MANAGER_STATUS_CHANGED", qemuMonitorJSONHandlePRManagerStatusChanged, },
|
|
{ "RDMA_GID_STATUS_CHANGED", qemuMonitorJSONHandleRdmaGidStatusChanged, },
|
|
@@ -1044,6 +1046,20 @@ qemuMonitorJSONHandleNetdevStreamDisconnected(qemuMonitor *mon, virJSONValue *da
|
|
}
|
|
|
|
|
|
+static void
|
|
+qemuMonitorJSONHandleNetdevVhostUserDisconnected(qemuMonitor *mon, virJSONValue *data)
|
|
+{
|
|
+ const char *name;
|
|
+
|
|
+ if (!(name = virJSONValueObjectGetString(data, "netdev-id"))) {
|
|
+ VIR_WARN("missing device in NETDEV_VHOST_USER_DISCONNECTED event");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ qemuMonitorEmitNetdevVhostUserDisconnected(mon, name);
|
|
+}
|
|
+
|
|
+
|
|
static void
|
|
qemuMonitorJSONHandleNicRxFilterChanged(qemuMonitor *mon, virJSONValue *data)
|
|
{
|
|
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
|
index ad7e99750f..2076ad8208 100644
|
|
--- a/src/qemu/qemu_process.c
|
|
+++ b/src/qemu/qemu_process.c
|
|
@@ -1402,6 +1402,23 @@ qemuProcessHandleNetdevStreamDisconnected(qemuMonitor *mon G_GNUC_UNUSED,
|
|
}
|
|
|
|
|
|
+static void
|
|
+qemuProcessHandleNetdevVhostUserDisconnected(qemuMonitor *mon G_GNUC_UNUSED,
|
|
+ virDomainObj *vm,
|
|
+ const char *devAlias)
|
|
+{
|
|
+ virObjectLock(vm);
|
|
+
|
|
+ VIR_DEBUG("Device %s Netdev vhost-user Disconnected in domain %p %s",
|
|
+ devAlias, vm, vm->def->name);
|
|
+
|
|
+ qemuProcessEventSubmit(vm, QEMU_PROCESS_EVENT_NETDEV_VHOST_USER_DISCONNECTED,
|
|
+ 0, 0, g_strdup(devAlias));
|
|
+
|
|
+ virObjectUnlock(vm);
|
|
+}
|
|
+
|
|
+
|
|
static void
|
|
qemuProcessHandleNicRxFilterChanged(qemuMonitor *mon G_GNUC_UNUSED,
|
|
virDomainObj *vm,
|
|
@@ -1848,6 +1865,7 @@ static qemuMonitorCallbacks monitorCallbacks = {
|
|
.domainMemoryDeviceSizeChange = qemuProcessHandleMemoryDeviceSizeChange,
|
|
.domainDeviceUnplugError = qemuProcessHandleDeviceUnplugErr,
|
|
.domainNetdevStreamDisconnected = qemuProcessHandleNetdevStreamDisconnected,
|
|
+ .domainNetdevVhostUserDisconnected = qemuProcessHandleNetdevVhostUserDisconnected,
|
|
};
|
|
|
|
static void
|
|
--
|
|
2.49.0
|