]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Honour 'virtlogd' use when hotplugging chardevs
authorPeter Krempa <pkrempa@redhat.com>
Wed, 9 Feb 2022 14:43:03 +0000 (15:43 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 14 Feb 2022 12:14:00 +0000 (13:14 +0100)
Setup the chardev similarly to how we do it on startup so that virtlogd
is properly used with chardevs which are hotplugged to a VM.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_driver.c
src/qemu/qemu_hotplug.c
src/qemu/qemu_hotplug.h
tests/qemuhotplugmock.c
tests/qemuhotplugtest.c

index 9279eaf811f030925bf3799594a6583faacf29e6..d6876baa34ab6ea359ae7fe30a2e700269d4fe86 100644 (file)
@@ -6730,8 +6730,7 @@ qemuDomainAttachDeviceLive(virDomainObj *vm,
         break;
 
     case VIR_DOMAIN_DEVICE_CHR:
-        ret = qemuDomainAttachChrDevice(driver, vm,
-                                        dev->data.chr);
+        ret = qemuDomainAttachChrDevice(driver, vm, dev);
         if (!ret) {
             alias = dev->data.chr->info.alias;
             dev->data.chr = NULL;
index 05993aa5d7e60991cea9932c3c15bcf81440e41f..c70bc361fd7094d25114e59eda196aca94e9956e 100644 (file)
@@ -2180,10 +2180,14 @@ qemuDomainAttachChrDeviceAssignAddr(virDomainObj *vm,
     return 0;
 }
 
-int qemuDomainAttachChrDevice(virQEMUDriver *driver,
-                              virDomainObj *vm,
-                              virDomainChrDef *chr)
+
+int
+qemuDomainAttachChrDevice(virQEMUDriver *driver,
+                          virDomainObj *vm,
+                          virDomainDeviceDef *dev)
 {
+    virDomainChrDef *chr = dev->data.chr;
+    qemuDomainChrSourcePrivate *charpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(chr->source);
     int ret = -1;
     qemuDomainObjPrivate *priv = vm->privateData;
     virErrorPtr orig_err;
@@ -2224,6 +2228,19 @@ int qemuDomainAttachChrDevice(virQEMUDriver *driver,
         goto cleanup;
     teardowncgroup = true;
 
+    if (qemuProcessPrepareHostBackendChardevHotplug(vm, dev) < 0)
+        goto cleanup;
+
+    if (charpriv->sourcefd || charpriv->logfd) {
+        qemuDomainObjEnterMonitor(driver, vm);
+
+        if (qemuFDPassTransferMonitor(charpriv->sourcefd, priv->mon) < 0 ||
+            qemuFDPassTransferMonitor(charpriv->logfd, priv->mon) < 0)
+            goto exit_monitor;
+
+        qemuDomainObjExitMonitor(driver, vm);
+    }
+
     if (guestfwd) {
         if (!(netdevprops = qemuBuildChannelGuestfwdNetdevProps(chr)))
             goto cleanup;
@@ -2286,6 +2303,8 @@ int qemuDomainAttachChrDevice(virQEMUDriver *driver,
     /* detach associated chardev on error */
     if (chardevAttached)
         qemuMonitorDetachCharDev(priv->mon, charAlias);
+    qemuFDPassTransferMonitorRollback(charpriv->sourcefd, priv->mon);
+    qemuFDPassTransferMonitorRollback(charpriv->logfd, priv->mon);
     qemuDomainObjExitMonitor(driver, vm);
     virErrorRestore(&orig_err);
 
index 244dd5278d1b885a5d283b215049c378708a7726..19c07497b5a5d34d8cfb39d044eae8e900776dbb 100644 (file)
@@ -117,7 +117,7 @@ int qemuDomainAttachLease(virQEMUDriver *driver,
                           virDomainLeaseDef *lease);
 int qemuDomainAttachChrDevice(virQEMUDriver *driver,
                               virDomainObj *vm,
-                              virDomainChrDef *chr);
+                              virDomainDeviceDef *dev);
 int qemuDomainAttachRNGDevice(virQEMUDriver *driver,
                               virDomainObj *vm,
                               virDomainRNGDef *rng);
index 051f2b20dc5873242015b55bee0f783488d20b5f..e3f071505857c221e3ec59a4b1e17ff93cc567e4 100644 (file)
@@ -21,6 +21,7 @@
 #include "qemu/qemu_hotplug.h"
 #include "qemu/qemu_interface.h"
 #include "qemu/qemu_process.h"
+#include "testutilsqemu.h"
 #include "conf/domain_conf.h"
 #include "virdevmapper.h"
 #include "virutil.h"
@@ -96,3 +97,13 @@ qemuInterfaceVDPAConnect(virDomainNetDef *net G_GNUC_UNUSED)
     /* need a valid fd or sendmsg won't work. Just open /dev/null */
     return open("/dev/null", O_RDONLY);
 }
+
+
+int
+qemuProcessPrepareHostBackendChardevHotplug(virDomainObj *vm,
+                                            virDomainDeviceDef *dev)
+{
+    return qemuDomainDeviceBackendChardevForeachOne(dev,
+                                                    testQemuPrepareHostBackendChardevOne,
+                                                    vm);
+}
index fe1b227b4e77ac581eaf90b0810d24739996a9d8..ce215da099a91ec7ce5c5547f691b6b9a70b6de9 100644 (file)
@@ -135,7 +135,7 @@ testQemuHotplugAttach(virDomainObj *vm,
         ret = qemuDomainAttachDeviceDiskLive(&driver, vm, dev);
         break;
     case VIR_DOMAIN_DEVICE_CHR:
-        ret = qemuDomainAttachChrDevice(&driver, vm, dev->data.chr);
+        ret = qemuDomainAttachChrDevice(&driver, vm, dev);
         break;
     case VIR_DOMAIN_DEVICE_SHMEM:
         ret = qemuDomainAttachShmemDevice(&driver, vm, dev->data.shmem);