]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Convert vfioDeviceFd to qemuFDPassDirect
authorPavel Hrdina <phrdina@redhat.com>
Sun, 15 Feb 2026 18:28:16 +0000 (19:28 +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 204fdf152b33d14c13bb61e39972b69bd686f78c..91eb3cb27dc87c92fe5aba21c60da82a1ef4074c 100644 (file)
@@ -4818,12 +4818,10 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def,
         pcisrc->driver.iommufd == VIR_TRISTATE_BOOL_YES) {
         qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(dev);
 
-        if (hostdevPriv->vfioDeviceFd != -1) {
-            g_autofree char *fdstr = g_strdup_printf("%d", hostdevPriv->vfioDeviceFd);
-            if (virJSONValueObjectAdd(&props, "S:fd", fdstr, NULL) < 0)
-                return NULL;
-            hostdevPriv->vfioDeviceFd = -1;
-        }
+        if (virJSONValueObjectAdd(&props,
+                                  "S:fd", qemuFDPassDirectGetPath(hostdevPriv->vfioDeviceFd),
+                                  NULL) < 0)
+            return NULL;
     }
 
     if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0)
@@ -5273,10 +5271,7 @@ qemuBuildHostdevCommandLine(virCommand *cmd,
             if (subsys->u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) {
                 qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
 
-                if (hostdevPriv->vfioDeviceFd != -1) {
-                    virCommandPassFD(cmd, hostdevPriv->vfioDeviceFd,
-                                     VIR_COMMAND_PASS_FD_CLOSE_PARENT);
-                }
+                qemuFDPassDirectTransferCommand(hostdevPriv->vfioDeviceFd, cmd);
             }
 
             if (!(devprops = qemuBuildPCIHostdevDevProps(def, hostdev)))
index d9cd9324e060fff674699cbf7a53ee20a05b45e5..ada9d3431c1d840eaf06c571c571e6b1fdde9644 100644 (file)
@@ -1245,7 +1245,7 @@ qemuDomainHostdevPrivateDispose(void *obj)
 {
     qemuDomainHostdevPrivate *priv = obj;
 
-    VIR_FORCE_CLOSE(priv->vfioDeviceFd);
+    g_clear_pointer(&priv->vfioDeviceFd, qemuFDPassDirectFree);
 }
 
 
@@ -1271,7 +1271,7 @@ qemuDomainHostdevPrivateNew(void)
     if (!(priv = virObjectNew(qemuDomainHostdevPrivateClass)))
         return NULL;
 
-    priv->vfioDeviceFd = -1;
+    priv->vfioDeviceFd = NULL;
 
     return (virObject *) priv;
 }
index c6430b1bfbf9017c1e9246ef75f385b9c1ab44fa..fa7d4ab40f0ced2f9aae6923e3942f2cb1e15470 100644 (file)
@@ -463,7 +463,7 @@ struct _qemuDomainHostdevPrivate {
     virObject parent;
 
     /* VFIO device file descriptor for iommufd passthrough */
-    int vfioDeviceFd;
+    qemuFDPassDirect *vfioDeviceFd;
 };
 
 
index c814f992bba7c06eef8ed39f9c690299a987283c..fc7e7bc98011368f05e8d00d2d1aa8605f4a4353 100644 (file)
@@ -7714,10 +7714,14 @@ qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev)
 {
     qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
     virDomainHostdevSubsysPCI *pci = &hostdev->source.subsys.u.pci;
+    g_autofree char *name = g_strdup_printf("hostdev-%s-fd", hostdev->info->alias);
+    int vfioDeviceFd;
 
-    if ((hostdevPriv->vfioDeviceFd = virPCIDeviceOpenVfioFd(&pci->addr)) < 0)
+    if ((vfioDeviceFd = virPCIDeviceOpenVfioFd(&pci->addr)) < 0)
         return -1;
 
+    hostdevPriv->vfioDeviceFd = qemuFDPassDirectNew(name, &vfioDeviceFd);
+
     return 0;
 }
 
index 13055eef84136729055cb2f3acb14d05bcfed11b..d2ab4a71b5368efa1a7673c5e11c1d0565730e69 100644 (file)
@@ -357,8 +357,10 @@ testQemuPrepareHostdevPCI(virDomainHostdevDef *hostdev)
     qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
 
     if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) {
+        g_autofree char *name = g_strdup_printf("hostdev-%s-fd", hostdev->info->alias);
         /* Use a placeholder FD value for tests */
-        hostdevPriv->vfioDeviceFd = 0;
+        int vfioDeviceFD = 0;
+        hostdevPriv->vfioDeviceFd = qemuFDPassDirectNew(name, &vfioDeviceFD);
     }
 }