]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Store chardev 'wait' flag in chardev source private data
authorPeter Krempa <pkrempa@redhat.com>
Wed, 3 Nov 2021 13:12:16 +0000 (14:12 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 10 Dec 2021 15:37:42 +0000 (16:37 +0100)
We have just one case when we wish to wait for incomming connections for
a listening socket and that is for vhost-user network devices.

Passing this via a flag to qemuBuildChrChardevStr is unwieldy. Add a
field to qemuDomainChrSourcePrivate and populate it for our special
case inside of qemuDomainPrepareChardevSourceOne.

Since we wait for incomming connections only on startup of a new VM we
also need to pass in a flag whether qemuDomainPrepareChardevSourceOne
is called on a new start or on hotplug.

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

index b637cd2bf51042a5b45b4dc5162b21ccb307b6de..0baf3acde6409f9d53b1d0817409d2a332f6655f 100644 (file)
@@ -5051,7 +5051,7 @@ qemuBuildChrChardevStr(virLogManager *logManager G_GNUC_UNUSED,
                        const virDomainChrSourceDef *dev,
                        const char *alias,
                        virQEMUCaps *qemuCaps,
-                       unsigned int cdevflags)
+                       unsigned int cdevflags G_GNUC_UNUSED)
 {
     qemuDomainChrSourcePrivate *chrSourcePriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(dev);
     g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
@@ -5148,7 +5148,7 @@ qemuBuildChrChardevStr(virLogManager *logManager G_GNUC_UNUSED,
 
         if (dev->data.tcp.listen) {
             virBufferAddLit(&buf, ",server=on");
-            if (cdevflags & QEMU_BUILD_CHARDEV_TCP_NOWAIT)
+            if (!chrSourcePriv->wait)
                 virBufferAddLit(&buf, ",wait=off");
         }
 
@@ -5199,7 +5199,7 @@ qemuBuildChrChardevStr(virLogManager *logManager G_GNUC_UNUSED,
         }
         if (dev->data.nix.listen) {
             virBufferAddLit(&buf, ",server=on");
-            if (cdevflags & QEMU_BUILD_CHARDEV_TCP_NOWAIT)
+            if (!chrSourcePriv->wait)
                 virBufferAddLit(&buf, ",wait=off");
         }
 
index 550afca36e5e8cc3fa050fe2951fde04ec48a818..e6d6bf10f105fc6da861a7120afda6ec18a8b09d 100644 (file)
@@ -9735,6 +9735,7 @@ qemuDomainPrepareChardevSourceOne(virDomainDeviceDef *dev,
                                   void *opaque)
 {
     struct qemuDomainPrepareChardevSourceData *data = opaque;
+    qemuDomainChrSourcePrivate *charpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(charsrc);
 
     switch ((virDomainDeviceType) dev->type) {
 
@@ -9750,8 +9751,13 @@ qemuDomainPrepareChardevSourceOne(virDomainDeviceDef *dev,
         }
         break;
 
-    case VIR_DOMAIN_DEVICE_DISK:
     case VIR_DOMAIN_DEVICE_NET:
+        /* when starting a fresh VM, vhost-user network sockets wait for connection */
+        if (!data->hotplug)
+            charpriv->wait = true;
+        break;
+
+    case VIR_DOMAIN_DEVICE_DISK:
     case VIR_DOMAIN_DEVICE_SHMEM:
     case VIR_DOMAIN_DEVICE_LEASE:
     case VIR_DOMAIN_DEVICE_FS:
index f84acf408beb3a5eddc8e2f3a7dcf4a7704ca7d3..2d93cf2253e0cd627d8371fc34e08e6eb4cfe2df 100644 (file)
@@ -344,6 +344,7 @@ struct _qemuDomainChrSourcePrivate {
 
     int fd; /* file descriptor of the chardev source */
     int logfd; /* file descriptor of the logging source */
+    bool wait; /* wait for incomming connections on chardev */
 };
 
 
@@ -866,6 +867,7 @@ int qemuDomainPrepareChannel(virDomainChrDef *chr,
 
 struct qemuDomainPrepareChardevSourceData {
     virQEMUDriverConfig *cfg;
+    bool hotplug;
 };
 
 int
index 829f1bae9fbcf8e2ea9b1b22c6d72aec3d224f1f..e444ad2d45704d1a51e038ffdeb2330934d90f97 100644 (file)
@@ -6777,7 +6777,8 @@ qemuDomainAttachDeviceLive(virDomainObj *vm,
     int ret = -1;
     const char *alias = NULL;
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
-    struct qemuDomainPrepareChardevSourceData chardevBackendData = { .cfg = cfg };
+    struct qemuDomainPrepareChardevSourceData chardevBackendData = { .cfg = cfg,
+                                                                     .hotplug = true };
 
     if (qemuDomainDeviceBackendChardevForeachOne(dev,
                                                  qemuDomainPrepareChardevSourceOne,