]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: respond to NETDEV_VHOST_USER_DISCONNECTED event
authorLaine Stump <laine@redhat.com>
Fri, 4 Apr 2025 21:16:43 +0000 (17:16 -0400)
committerLaine Stump <laine@redhat.com>
Fri, 11 Apr 2025 03:47:25 +0000 (23:47 -0400)
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>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_driver.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_process.c

index 1435539e477d866b22351b8f153a885f4944e0b6..52da2343436b4f255457bea6f0e96de5dee29d68 100644 (file)
@@ -10087,6 +10087,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:
index 4718839192b193352ba04c656189320aa79ab224..8c1993ec6443712cb3f3d32fdf3b48346e0f5cf4 100644 (file)
@@ -469,6 +469,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,
index 5b46616c5b2f8c8272bea7e16c2501ae5f7bec3d..f9e8f2a5581270595dbd7c8fd42fad5c23738659 100644 (file)
@@ -3680,6 +3680,14 @@ processNetdevStreamDisconnectedEvent(virDomainObj *vm,
 }
 
 
+static void
+processNetdevVhostUserDisconnectedEvent(virDomainObj *vm,
+                                        const char *netdevId)
+{
+    processNetdevDisconnectedEvent(vm, netdevId, "NETDEV_VHOST_USER_DISCONNECTED");
+}
+
+
 static void
 processNicRxFilterChangedEvent(virQEMUDriver *driver,
                                virDomainObj *vm,
@@ -4081,6 +4089,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(driver, vm, processEvent->data);
         break;
index 8262e3a8b2ec65221dc931e3fb08f45bd722b492..981975cdd2fcf10b7137d1094194c4d0b3e844e7 100644 (file)
@@ -1264,6 +1264,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,
index 4acf50a16661ef9b5f34279611f76a8550d883f5..8d49ada114f54e5d659ab2b4479d011ac8d976c7 100644 (file)
@@ -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,
index 6fa301577d5ecc519767488d19163be6a6fd1cae..dc2eaace96f58213bcf25c5661307e81463ce1ac 100644 (file)
@@ -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)
 {
index 809029cefcc1ca860e268f3de0c518e6437667e7..8a758f78adcc3dfc63ddadf172bdb0a1c2528a86 100644 (file)
@@ -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