]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Convert IOMMUFD to qemuFDPassDirect
authorPavel Hrdina <phrdina@redhat.com>
Sun, 15 Feb 2026 18:42:39 +0000 (19:42 +0100)
committerPavel Hrdina <phrdina@redhat.com>
Mon, 16 Feb 2026 14:50:39 +0000 (15:50 +0100)
This cleans up creating QEMU command line and makes it easier when
adding hotplug support.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_command.c
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_process.c
tests/qemuxmlconftest.c

index f400835332cbf2772253875d65eb12934b27d9ad..204fdf152b33d14c13bb61e39972b69bd686f78c 100644 (file)
@@ -5357,19 +5357,16 @@ qemuBuildIOMMUFDCommandLine(virCommand *cmd,
                             virDomainObj *vm)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
-    g_autofree char *fdstr = g_strdup_printf("%d", priv->iommufd);
     g_autoptr(virJSONValue) props = NULL;
 
     if (!virDomainDefHasPCIHostdevWithIOMMUFD(def))
         return 0;
 
-    virCommandPassFD(cmd, priv->iommufd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
-
-    priv->iommufd = -1;
+    qemuFDPassDirectTransferCommand(priv->iommufd, cmd);
 
     if (qemuMonitorCreateObjectProps(&props, "iommufd",
                                      "iommufd0",
-                                     "S:fd", fdstr,
+                                     "S:fd", qemuFDPassDirectGetPath(priv->iommufd),
                                      NULL) < 0)
         return -1;
 
index 64b01e524f3c2135f899311f9cdc2bab634d3bf6..d9cd9324e060fff674699cbf7a53ee20a05b45e5 100644 (file)
@@ -1975,7 +1975,7 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivate *priv)
 
     priv->migrationRecoverSetup = false;
 
-    VIR_FORCE_CLOSE(priv->iommufd);
+    g_clear_pointer(&priv->iommufd, qemuFDPassDirectFree);
 
     g_clear_pointer(&priv->memoryBackingDir, g_free);
 }
@@ -2044,7 +2044,7 @@ qemuDomainObjPrivateAlloc(void *opaque)
     priv->blockjobs = virHashNew(virObjectUnref);
     priv->fds = virHashNew(g_object_unref);
 
-    priv->iommufd = -1;
+    priv->iommufd = NULL;
     priv->pidMonitored = -1;
 
     /* agent commands block by default, user can choose different behavior */
index 510a8339b0ab2f64c6d3dcf0db9a1eb43edd7325..c6430b1bfbf9017c1e9246ef75f385b9c1ab44fa 100644 (file)
@@ -264,7 +264,7 @@ struct _qemuDomainObjPrivate {
     /* named file descriptor groups associated with the VM */
     GHashTable *fds;
 
-    int iommufd;
+    qemuFDPassDirect *iommufd;
 
     char *memoryBackingDir;
 };
index c5c1ef77ec5997427b7ad78f71385c9246e539fb..c814f992bba7c06eef8ed39f9c690299a987283c 100644 (file)
@@ -7689,13 +7689,15 @@ static int
 qemuProcessOpenIommuFd(virDomainObj *vm)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
+    int iommufd;
 
     VIR_DEBUG("Opening IOMMU FD for domain %s", vm->def->name);
 
-    if ((priv->iommufd = virIOMMUFDOpenDevice()) < 0)
+    if ((iommufd = virIOMMUFDOpenDevice()) < 0)
         return -1;
 
-    VIR_DEBUG("Opened IOMMU FD %d for domain %s", priv->iommufd, vm->def->name);
+    priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd);
+
     return 0;
 }
 
index 4ab004a95455c66e77eaf5ed3d1cb0cebf38d7a0..13055eef84136729055cb2f3acb14d05bcfed11b 100644 (file)
@@ -412,8 +412,10 @@ testQemuPrepareHostdev(virDomainObj *vm)
         }
     }
 
-    if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def))
-        priv->iommufd = 0;
+    if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def)) {
+        int iommufd = 0;
+        priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd);
+    }
 }