[libvirt PATCH 08/11] qemu: Implement iommufd

Pavel Hrdina via Devel posted 11 patches 4 days, 6 hours ago
[libvirt PATCH 08/11] qemu: Implement iommufd
Posted by Pavel Hrdina via Devel 4 days, 6 hours ago
From: Pavel Hrdina <phrdina@redhat.com>

Ideally this should be done in qemuDomainHostdevDefPostParse but that
would require a lot of refactoring mainly due to how interface backed by
hostdev works.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
---
 src/qemu/qemu_domain.c  | 12 +++++++++---
 src/qemu/qemu_domain.h  |  3 ++-
 src/qemu/qemu_hotplug.c |  2 +-
 src/qemu/qemu_process.c |  4 ++--
 4 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 1d00ff2845..e667d74f1a 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -10110,10 +10110,12 @@ qemuDomainPrepareHostdevSCSI(virDomainHostdevDef *hostdev,
 
 
 static int
-qemuDomainPrepareHostdevPCI(virDomainHostdevDef *hostdev,
+qemuDomainPrepareHostdevPCI(const virDomainDef *def,
+                            virDomainHostdevDef *hostdev,
                             virQEMUCaps *qemuCaps)
 {
     virDeviceHostdevPCIDriverName *driverName = &hostdev->source.subsys.u.pci.driver.name;
+    virDomainHostdevSubsysPCI *pcisrc = &hostdev->source.subsys.u.pci;
 
     /* assign defaults for hostdev passthrough */
     switch (*driverName) {
@@ -10150,12 +10152,16 @@ qemuDomainPrepareHostdevPCI(virDomainHostdevDef *hostdev,
         return -1;
     }
 
+    if (pcisrc->driver.iommufd == VIR_TRISTATE_BOOL_ABSENT)
+        pcisrc->driver.iommufd = def->iommufd;
+
     return 0;
 }
 
 
 int
-qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev,
+qemuDomainPrepareHostdev(const virDomainDef *def,
+                         virDomainHostdevDef *hostdev,
                          qemuDomainObjPrivate *priv)
 {
     if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
@@ -10165,7 +10171,7 @@ qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev,
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
         return qemuDomainPrepareHostdevSCSI(hostdev, priv);
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
-        return qemuDomainPrepareHostdevPCI(hostdev, priv->qemuCaps);
+        return qemuDomainPrepareHostdevPCI(def, hostdev, priv->qemuCaps);
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 5755d2adb0..f797542a87 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -1040,7 +1040,8 @@ qemuDomainDiskCachemodeFlags(virDomainDiskCache cachemode,
                              bool *noflush);
 
 int
-qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev,
+qemuDomainPrepareHostdev(const virDomainDef *def,
+                         virDomainHostdevDef *hostdev,
                          qemuDomainObjPrivate *priv);
 
 char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivate *priv);
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index d6be851e61..adae94f0a2 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -2891,7 +2891,7 @@ qemuDomainAttachHostDevice(virQEMUDriver *driver,
         return -1;
     }
 
-    if (qemuDomainPrepareHostdev(hostdev, vm->privateData) < 0)
+    if (qemuDomainPrepareHostdev(vm->def, hostdev, vm->privateData) < 0)
         return -1;
 
     switch (hostdev->source.subsys.type) {
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index ecd05b4bf6..fed6079ad2 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6087,7 +6087,7 @@ qemuProcessPrepareDomainNetwork(virDomainObj *vm)
                 /* For hostdev present in qemuProcessPrepareDomain() phase this was
                  * done already, but this code runs after that, so we have to call
                  * it ourselves. */
-                if (qemuDomainPrepareHostdev(hostdev, priv) < 0)
+                if (qemuDomainPrepareHostdev(def, hostdev, priv) < 0)
                     return -1;
 
                 virDomainHostdevInsert(def, hostdev);
@@ -6875,7 +6875,7 @@ qemuProcessPrepareDomainHostdevs(virDomainObj *vm,
     for (i = 0; i < vm->def->nhostdevs; i++) {
         virDomainHostdevDef *hostdev = vm->def->hostdevs[i];
 
-        if (qemuDomainPrepareHostdev(hostdev, priv) < 0)
+        if (qemuDomainPrepareHostdev(vm->def, hostdev, priv) < 0)
             return -1;
     }
 
-- 
2.53.0
Re: [libvirt PATCH 08/11] qemu: Implement iommufd
Posted by Peter Krempa via Devel 3 days, 14 hours ago
On Thu, Mar 19, 2026 at 17:36:54 +0100, Pavel Hrdina via Devel wrote:
> From: Pavel Hrdina <phrdina@redhat.com>
> 
> Ideally this should be done in qemuDomainHostdevDefPostParse but that
> would require a lot of refactoring mainly due to how interface backed by
> hostdev works.
> 
> Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
> ---
>  src/qemu/qemu_domain.c  | 12 +++++++++---
>  src/qemu/qemu_domain.h  |  3 ++-
>  src/qemu/qemu_hotplug.c |  2 +-
>  src/qemu/qemu_process.c |  4 ++--
>  4 files changed, 14 insertions(+), 7 deletions(-)

Reviewed-by: Peter Krempa <pkrempa@redhat.com>