]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Introduce virDomainDefHasPCIHostdevWithIOMMUFD
authorPavel Hrdina <phrdina@redhat.com>
Sun, 15 Feb 2026 17:19:56 +0000 (18:19 +0100)
committerPavel Hrdina <phrdina@redhat.com>
Mon, 16 Feb 2026 14:50:39 +0000 (15:50 +0100)
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_command.c

index 98d34f408df1e82f4fc41e3166d94747e9b77778..453e3010412d2b2b004868b9af6ca89535f4a876 100644 (file)
@@ -32663,6 +32663,20 @@ virDomainDefHasPCIHostdev(const virDomainDef *def)
 }
 
 
+bool
+virDomainDefHasPCIHostdevWithIOMMUFD(const virDomainDef *def)
+{
+    size_t i;
+
+    for (i = 0; i < def->nhostdevs; i++) {
+        if (virHostdevIsPCIDeviceWithIOMMUFD(def->hostdevs[i]))
+            return true;
+    }
+
+    return false;
+}
+
+
 bool
 virDomainDefHasMdevHostdev(const virDomainDef *def)
 {
index f98fed650a54961e32110d52fd8ec7b6e4d460d0..a13f6d79e94a7a63c13178aa9844e4941e1a955f 100644 (file)
@@ -4662,6 +4662,9 @@ virDomainDefHasNVMeDisk(const virDomainDef *def);
 bool
 virDomainDefHasPCIHostdev(const virDomainDef *def);
 
+bool
+virDomainDefHasPCIHostdevWithIOMMUFD(const virDomainDef *def);
+
 bool
 virDomainDefHasMdevHostdev(const virDomainDef *def);
 
index 15a56a262a7d809c4a399ee634a80d341a7765e9..d8ae4f46cdea6f5e6e5706a239730a362055d7ae 100644 (file)
@@ -348,6 +348,7 @@ virDomainDefHasNVMeDisk;
 virDomainDefHasOldStyleROUEFI;
 virDomainDefHasOldStyleUEFI;
 virDomainDefHasPCIHostdev;
+virDomainDefHasPCIHostdevWithIOMMUFD;
 virDomainDefHasTimer;
 virDomainDefHasUSB;
 virDomainDefHasVcpusOffline;
index c09c883a28f8303211d94da9ac412cb011e346a1..f400835332cbf2772253875d65eb12934b27d9ad 100644 (file)
@@ -5356,43 +5356,25 @@ qemuBuildIOMMUFDCommandLine(virCommand *cmd,
                             const virDomainDef *def,
                             virDomainObj *vm)
 {
-    size_t i;
     qemuDomainObjPrivate *priv = vm->privateData;
     g_autofree char *fdstr = g_strdup_printf("%d", priv->iommufd);
+    g_autoptr(virJSONValue) props = NULL;
 
+    if (!virDomainDefHasPCIHostdevWithIOMMUFD(def))
+        return 0;
 
-    for (i = 0; i < def->nhostdevs; i++) {
-        virDomainHostdevDef *hostdev = def->hostdevs[i];
-        virDomainHostdevSubsys *subsys = &hostdev->source.subsys;
-        g_autoptr(virJSONValue) props = NULL;
-
-        if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
-            continue;
-
-        if (subsys->type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
-            continue;
-
-        if (hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED)
-            continue;
-
-        if (subsys->u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES)
-            continue;
-
-        virCommandPassFD(cmd, priv->iommufd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
+    virCommandPassFD(cmd, priv->iommufd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
 
-        priv->iommufd = -1;
+    priv->iommufd = -1;
 
-        if (qemuMonitorCreateObjectProps(&props, "iommufd",
-                                         "iommufd0",
-                                         "S:fd", fdstr,
-                                         NULL) < 0)
-            return -1;
-
-        if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0)
-            return -1;
+    if (qemuMonitorCreateObjectProps(&props, "iommufd",
+                                     "iommufd0",
+                                     "S:fd", fdstr,
+                                     NULL) < 0)
+        return -1;
 
-        break;
-    }
+    if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0)
+        return -1;
 
     return 0;
 }