[libvirt PATCH 00/24] IOMMUFD fixes and hotplug support
Fix some FD leaks in the code, code refactor and improvements as preparation for implementing hotplug support. Add domain capability to report if IOMMUFD is supported. Pavel Hrdina (24): qemu: Introduce QEMU_CAPS_OBJECT_IOMMUFD qemu: Move IOMMUFD validation to qemu_validate util: Move openning IOMMU device to viriommufd qemu_process: Refactor qemuProcessOpenIommuFd util: Move openning VFIO device to virpci qemu_process: Refactor qemuProcessOpenVfioDeviceFd util: Use virPCIDevice as argument in virPCIDeviceGetVfioPath conf: Introduce virHostdevIsPCIDeviceWithIOMMUFD conf: Introduce virDomainDefHasPCIHostdevWithIOMMUFD qemu_domain: Add missing IOMMUFD cleanup qemu_process: Fix FD leak with multiple host devices using IOMMUFD qemu_process: Refactor qemuProcessOpenVfioFds qemuxmlconftest: Refactor host device preparation qemuxmlconftest: Rename and refactor testSetupHostdevPrivateData qemuxmlconftest: Set fake FD for IOMMUFD qemu: Convert IOMMUFD to qemuFDPassDirect qemu: Convert vfioDeviceFd to qemuFDPassDirect qemu_command: Don't use host property if IOMMUFD is used qemu: Save IOMMUFD state into status XML qemu_hotplug: Remove iommufd object if no longer needed qemu_command: Extract building IOMMUFD props to function qemu_hotplug: Add support to hotplug host device with IOMMUFD conf: Introduce iommufd enum for domaincaps qemu: Fill iommufd domain capability docs/formatdomaincaps.rst | 7 ++ src/conf/domain_capabilities.c | 1 + src/conf/domain_capabilities.h | 1 + src/conf/domain_conf.c | 29 +++++ src/conf/domain_conf.h | 6 + src/libvirt_private.syms | 6 +- src/qemu/qemu_capabilities.c | 23 +++- src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 86 ++++++-------- src/qemu/qemu_command.h | 3 + src/qemu/qemu_domain.c | 14 ++- src/qemu/qemu_domain.h | 5 +- src/qemu/qemu_hotplug.c | 47 ++++++++ src/qemu/qemu_process.c | 111 ++++++------------ src/qemu/qemu_process.h | 3 + src/qemu/qemu_validate.c | 15 +++ src/security/security_apparmor.c | 2 +- src/security/security_dac.c | 4 +- src/security/security_selinux.c | 4 +- src/util/viriommufd.c | 35 +++++- src/util/viriommufd.h | 4 +- src/util/virpci.c | 40 ++++++- src/util/virpci.h | 4 +- .../qemu_10.0.0-q35.x86_64+amdsev.xml | 4 + .../domaincapsdata/qemu_10.0.0-q35.x86_64.xml | 4 + .../qemu_10.0.0-tcg.x86_64+amdsev.xml | 4 + .../domaincapsdata/qemu_10.0.0-tcg.x86_64.xml | 4 + .../qemu_10.0.0-virt.aarch64.xml | 4 + tests/domaincapsdata/qemu_10.0.0.aarch64.xml | 4 + tests/domaincapsdata/qemu_10.0.0.ppc64.xml | 3 + tests/domaincapsdata/qemu_10.0.0.s390x.xml | 4 + .../qemu_10.0.0.x86_64+amdsev.xml | 4 + tests/domaincapsdata/qemu_10.0.0.x86_64.xml | 4 + .../qemu_10.1.0-q35.x86_64+inteltdx.xml | 4 + .../domaincapsdata/qemu_10.1.0-q35.x86_64.xml | 4 + .../qemu_10.1.0-tcg.x86_64+inteltdx.xml | 4 + .../domaincapsdata/qemu_10.1.0-tcg.x86_64.xml | 4 + tests/domaincapsdata/qemu_10.1.0.s390x.xml | 4 + .../qemu_10.1.0.x86_64+inteltdx.xml | 4 + tests/domaincapsdata/qemu_10.1.0.x86_64.xml | 4 + .../qemu_10.2.0-q35.x86_64+mshv.xml | 4 + .../domaincapsdata/qemu_10.2.0-q35.x86_64.xml | 4 + .../qemu_10.2.0-tcg.x86_64+mshv.xml | 4 + .../domaincapsdata/qemu_10.2.0-tcg.x86_64.xml | 4 + .../qemu_10.2.0-virt.aarch64.xml | 4 + tests/domaincapsdata/qemu_10.2.0.aarch64.xml | 4 + .../qemu_10.2.0.x86_64+mshv.xml | 4 + tests/domaincapsdata/qemu_10.2.0.x86_64.xml | 4 + .../domaincapsdata/qemu_11.0.0-q35.x86_64.xml | 4 + .../domaincapsdata/qemu_11.0.0-tcg.x86_64.xml | 4 + .../qemu_11.0.0-virt.aarch64.xml | 4 + tests/domaincapsdata/qemu_11.0.0.aarch64.xml | 4 + tests/domaincapsdata/qemu_11.0.0.x86_64.xml | 4 + .../domaincapsdata/qemu_6.2.0-q35.x86_64.xml | 3 + .../domaincapsdata/qemu_6.2.0-tcg.x86_64.xml | 3 + tests/domaincapsdata/qemu_6.2.0.ppc64.xml | 3 + tests/domaincapsdata/qemu_6.2.0.x86_64.xml | 3 + .../domaincapsdata/qemu_7.0.0-q35.x86_64.xml | 3 + .../domaincapsdata/qemu_7.0.0-tcg.x86_64.xml | 3 + tests/domaincapsdata/qemu_7.0.0.ppc64.xml | 3 + tests/domaincapsdata/qemu_7.0.0.x86_64.xml | 3 + .../domaincapsdata/qemu_7.1.0-q35.x86_64.xml | 3 + .../domaincapsdata/qemu_7.1.0-tcg.x86_64.xml | 3 + tests/domaincapsdata/qemu_7.1.0.ppc64.xml | 3 + tests/domaincapsdata/qemu_7.1.0.x86_64.xml | 3 + .../qemu_7.2.0-hvf.x86_64+hvf.xml | 3 + .../domaincapsdata/qemu_7.2.0-q35.x86_64.xml | 3 + .../qemu_7.2.0-tcg.x86_64+hvf.xml | 3 + .../domaincapsdata/qemu_7.2.0-tcg.x86_64.xml | 3 + tests/domaincapsdata/qemu_7.2.0.ppc.xml | 3 + tests/domaincapsdata/qemu_7.2.0.x86_64.xml | 3 + .../domaincapsdata/qemu_8.0.0-q35.x86_64.xml | 3 + .../domaincapsdata/qemu_8.0.0-tcg.x86_64.xml | 3 + tests/domaincapsdata/qemu_8.0.0.x86_64.xml | 3 + .../domaincapsdata/qemu_8.1.0-q35.x86_64.xml | 3 + .../domaincapsdata/qemu_8.1.0-tcg.x86_64.xml | 3 + tests/domaincapsdata/qemu_8.1.0.s390x.xml | 3 + tests/domaincapsdata/qemu_8.1.0.x86_64.xml | 3 + .../domaincapsdata/qemu_8.2.0-q35.x86_64.xml | 3 + .../qemu_8.2.0-tcg-virt.loongarch64.xml | 3 + .../domaincapsdata/qemu_8.2.0-tcg.x86_64.xml | 3 + .../qemu_8.2.0-virt.aarch64.xml | 3 + .../qemu_8.2.0-virt.loongarch64.xml | 3 + tests/domaincapsdata/qemu_8.2.0.aarch64.xml | 3 + tests/domaincapsdata/qemu_8.2.0.armv7l.xml | 3 + tests/domaincapsdata/qemu_8.2.0.s390x.xml | 3 + tests/domaincapsdata/qemu_8.2.0.x86_64.xml | 3 + .../domaincapsdata/qemu_9.0.0-q35.x86_64.xml | 4 + .../domaincapsdata/qemu_9.0.0-tcg.x86_64.xml | 4 + tests/domaincapsdata/qemu_9.0.0.sparc.xml | 3 + tests/domaincapsdata/qemu_9.0.0.x86_64.xml | 4 + .../domaincapsdata/qemu_9.1.0-q35.x86_64.xml | 4 + .../qemu_9.1.0-tcg-virt.riscv64.xml | 3 + .../domaincapsdata/qemu_9.1.0-tcg.x86_64.xml | 4 + .../qemu_9.1.0-virt.riscv64.xml | 3 + tests/domaincapsdata/qemu_9.1.0.s390x.xml | 4 + tests/domaincapsdata/qemu_9.1.0.x86_64.xml | 4 + .../qemu_9.2.0-hvf.aarch64+hvf.xml | 3 + .../qemu_9.2.0-q35.x86_64+amdsev.xml | 4 + .../domaincapsdata/qemu_9.2.0-q35.x86_64.xml | 4 + .../qemu_9.2.0-tcg.x86_64+amdsev.xml | 4 + .../domaincapsdata/qemu_9.2.0-tcg.x86_64.xml | 4 + tests/domaincapsdata/qemu_9.2.0.s390x.xml | 4 + .../qemu_9.2.0.x86_64+amdsev.xml | 4 + tests/domaincapsdata/qemu_9.2.0.x86_64.xml | 4 + tests/domaincapsmock.c | 17 ++- .../caps_10.0.0_aarch64.xml | 1 + .../caps_10.0.0_s390x.xml | 1 + .../caps_10.0.0_x86_64+amdsev.xml | 1 + .../caps_10.0.0_x86_64.xml | 1 + .../caps_10.1.0_s390x.xml | 1 + .../caps_10.1.0_x86_64+inteltdx.xml | 1 + .../caps_10.1.0_x86_64.xml | 1 + .../caps_10.2.0_aarch64.xml | 1 + .../caps_10.2.0_x86_64+mshv.xml | 1 + .../caps_10.2.0_x86_64.xml | 1 + .../caps_11.0.0_aarch64.xml | 1 + .../caps_11.0.0_x86_64.xml | 1 + .../caps_9.0.0_x86_64.xml | 1 + .../qemucapabilitiesdata/caps_9.1.0_s390x.xml | 1 + .../caps_9.1.0_x86_64.xml | 1 + .../qemucapabilitiesdata/caps_9.2.0_s390x.xml | 1 + .../caps_9.2.0_x86_64+amdsev.xml | 1 + .../caps_9.2.0_x86_64.xml | 1 + .../iommufd-q35.x86_64-latest.args | 4 +- ...fd-virt-pci-bus-single.aarch64-latest.args | 4 +- .../iommufd-virt.aarch64-latest.args | 6 +- .../iommufd.x86_64-latest.args | 4 +- tests/qemuxmlconftest.c | 100 +++++++++------- 129 files changed, 694 insertions(+), 199 deletions(-) -- 2.53.0
Detect if QEMU was compiled with IOMMUFD. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_validate.c | 8 ++++++++ tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml | 1 + tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml | 1 + .../qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml | 1 + tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml | 1 + tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml | 1 + tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml | 1 + 21 files changed, 29 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 67c60a3912..5a1545c727 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -759,6 +759,7 @@ VIR_ENUM_IMPL(virQEMUCaps, /* 490 */ "scsi-block.migrate-pr", /* QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR */ + "iommufd", /* QEMU_CAPS_OBJECT_IOMMUFD */ ); @@ -1466,6 +1467,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "tpm-emulator", QEMU_CAPS_DEVICE_TPM_EMULATOR }, { "tpm-passthrough", QEMU_CAPS_DEVICE_TPM_PASSTHROUGH }, { "acpi-generic-initiator", QEMU_CAPS_ACPI_GENERIC_INITIATOR }, + { "iommufd", QEMU_CAPS_OBJECT_IOMMUFD }, }; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 86ebe16b50..8d5c5cc94c 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -734,6 +734,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ /* 490 */ QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR, /* persistent reservation migration support */ + QEMU_CAPS_OBJECT_IOMMUFD, /* -object iommufd */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 2ca38db9f1..18700b5a9b 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -2722,6 +2722,14 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev, _("VFIO PCI device assignment is not supported by this version of qemu")); return -1; } + + if (hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_IOMMUFD)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("IOMMUFD is not supported by this version of qemu")); + return -1; + } + } } if (hostdev->writeFiltering != VIR_TRISTATE_BOOL_ABSENT) { diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml index c2bffe88ad..e5f55f461a 100644 --- a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml @@ -164,6 +164,7 @@ <flag name='usb-bot'/> <flag name='acpi-generic-initiator'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>10000000</version> <microcodeVersion>61700285</microcodeVersion> <package>v10.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml index 410f7c324c..96eadffcec 100644 --- a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml @@ -137,6 +137,7 @@ <flag name='nvme-ns'/> <flag name='usb-bot'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>10000000</version> <microcodeVersion>39100285</microcodeVersion> <package>v10.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml index a7166aba44..74a68c8402 100644 --- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml +++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml @@ -210,6 +210,7 @@ <flag name='usb-bot'/> <flag name='acpi-generic-initiator'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>10000000</version> <microcodeVersion>43100285</microcodeVersion> <package>v10.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml index 4177eb06b6..d593dd1ab8 100644 --- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml @@ -210,6 +210,7 @@ <flag name='usb-bot'/> <flag name='acpi-generic-initiator'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>10000000</version> <microcodeVersion>43100285</microcodeVersion> <package>v10.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml index 9faa853da2..3e271824c6 100644 --- a/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml @@ -141,6 +141,7 @@ <flag name='usb-bot'/> <flag name='qom-list-get'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>10001000</version> <microcodeVersion>39100286</microcodeVersion> <package>v10.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml index d5566234a2..512186a341 100644 --- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml +++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml @@ -193,6 +193,7 @@ <flag name='qom-list-get'/> <flag name='acpi-generic-initiator'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>10001000</version> <microcodeVersion>43100286</microcodeVersion> <package>v10.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml index 12d2b262a5..d6f1009c77 100644 --- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml @@ -215,6 +215,7 @@ <flag name='qom-list-get'/> <flag name='acpi-generic-initiator'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>10001000</version> <microcodeVersion>43100286</microcodeVersion> <package>v10.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml index 7154cdb66c..54d10e1433 100644 --- a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml @@ -183,6 +183,7 @@ <flag name='disk-timed-stats'/> <flag name='query-accelerators'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>10002000</version> <microcodeVersion>61700287</microcodeVersion> <package>v10.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml index 0d627136e8..38f6a0f6c3 100644 --- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml +++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml @@ -203,6 +203,7 @@ <flag name='query-accelerators'/> <flag name='mshv'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>10002000</version> <microcodeVersion>43100287</microcodeVersion> <package>v10.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml index 5eae704512..1ed21b9bf7 100644 --- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml @@ -216,6 +216,7 @@ <flag name='disk-timed-stats'/> <flag name='query-accelerators'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>10002000</version> <microcodeVersion>43100287</microcodeVersion> <package>v10.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml index 89c02268e4..4e6edf8df9 100644 --- a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml @@ -184,6 +184,7 @@ <flag name='query-accelerators'/> <flag name='virtio-iommu.aw-bits'/> <flag name='scsi-block.migrate-pr'/> + <flag name='iommufd'/> <version>10002050</version> <microcodeVersion>61700286</microcodeVersion> <package>v10.2.0-1114-gb3abdfa486</package> diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml index 89e45331f6..22eaff6545 100644 --- a/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml @@ -217,6 +217,7 @@ <flag name='query-accelerators'/> <flag name='virtio-iommu.aw-bits'/> <flag name='scsi-block.migrate-pr'/> + <flag name='iommufd'/> <version>10002050</version> <microcodeVersion>43100286</microcodeVersion> <package>v10.2.0-1114-gb3abdfa486</package> diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml index 43c174e0e6..3b4aaa202c 100644 --- a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml @@ -205,6 +205,7 @@ <flag name='usb-bot'/> <flag name='acpi-generic-initiator'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>9000000</version> <microcodeVersion>43100245</microcodeVersion> <package>v9.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml index 78b7493b53..02c8e6f641 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml @@ -127,6 +127,7 @@ <flag name='nvme-ns'/> <flag name='usb-bot'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>9001000</version> <microcodeVersion>39100246</microcodeVersion> <package>v9.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml index d68bb783e8..84972cba68 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml @@ -204,6 +204,7 @@ <flag name='usb-bot'/> <flag name='acpi-generic-initiator'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>9001000</version> <microcodeVersion>43100246</microcodeVersion> <package>v9.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml index 01fb50038d..135812b527 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml @@ -130,6 +130,7 @@ <flag name='nvme-ns'/> <flag name='usb-bot'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>9002000</version> <microcodeVersion>39100247</microcodeVersion> <package>v9.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml index ac936bc17b..5097fc3900 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml @@ -208,6 +208,7 @@ <flag name='usb-bot'/> <flag name='acpi-generic-initiator'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>9002000</version> <microcodeVersion>43100247</microcodeVersion> <package>v9.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml index fd851d9201..b8bf0a3e9b 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml @@ -206,6 +206,7 @@ <flag name='usb-bot'/> <flag name='acpi-generic-initiator'/> <flag name='virtio-iommu.aw-bits'/> + <flag name='iommufd'/> <version>9002000</version> <microcodeVersion>43100247</microcodeVersion> <package>v9.2.0</package> -- 2.53.0
Fail early if kernel doesn't support IOMMUFD. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/libvirt_private.syms | 1 + src/qemu/qemu_process.c | 8 +------- src/qemu/qemu_validate.c | 7 +++++++ src/util/viriommufd.c | 13 +++++++++++++ src/util/viriommufd.h | 2 ++ 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8554191503..2f9fdc04ad 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2649,6 +2649,7 @@ virInitctlSetRunLevel; # util/viriommufd.h virIOMMUFDSetRLimitMode; +virIOMMUFDSupported; # util/viriscsi.h virISCSIConnectionLogin; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index c3f681f1dd..fd400ae8a6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7694,13 +7694,7 @@ qemuProcessOpenIommuFd(virDomainObj *vm) VIR_DEBUG("Opening IOMMU FD for domain %s", vm->def->name); if ((fd = open(VIR_IOMMU_DEV_PATH, O_RDWR | O_CLOEXEC)) < 0) { - if (errno == ENOENT) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("IOMMU FD support requires /dev/iommu device")); - } else { - virReportSystemError(errno, "%s", - _("cannot open /dev/iommu")); - } + virReportSystemError(errno, "%s", _("cannot open /dev/iommu")); return -1; } diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 18700b5a9b..16dd5fef1a 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -27,6 +27,7 @@ #include "qemu_process.h" #include "domain_conf.h" #include "virbitmap.h" +#include "viriommufd.h" #include "virlog.h" #include "virutil.h" @@ -2729,6 +2730,12 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev, _("IOMMUFD is not supported by this version of qemu")); return -1; } + + if (!virIOMMUFDSupported()) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("IOMMUFD is not supported by host kernel")); + return -1; + } } } diff --git a/src/util/viriommufd.c b/src/util/viriommufd.c index 5af097683d..44b30029a5 100644 --- a/src/util/viriommufd.c +++ b/src/util/viriommufd.c @@ -88,3 +88,16 @@ int virIOMMUFDSetRLimitMode(int fd G_GNUC_UNUSED, } #endif + +/** + * virIOMMUFDSupported: + * + * Check the presence of IOMMU device. + * + * Retruns: true if it exists, false otherwise + */ +bool +virIOMMUFDSupported(void) +{ + return virFileExists(VIR_IOMMU_DEV_PATH); +} diff --git a/src/util/viriommufd.h b/src/util/viriommufd.h index ebecfe3633..ec6be9fa66 100644 --- a/src/util/viriommufd.h +++ b/src/util/viriommufd.h @@ -23,3 +23,5 @@ #define VIR_IOMMU_DEV_PATH "/dev/iommu" int virIOMMUFDSetRLimitMode(int fd, bool processAccounting); + +bool virIOMMUFDSupported(void); -- 2.53.0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/libvirt_private.syms | 2 +- src/qemu/qemu_process.c | 9 +-------- src/util/viriommufd.c | 22 +++++++++++++++++++--- src/util/viriommufd.h | 2 +- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 2f9fdc04ad..576b1f6595 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2648,7 +2648,7 @@ virInitctlFifos; virInitctlSetRunLevel; # util/viriommufd.h -virIOMMUFDSetRLimitMode; +virIOMMUFDOpenDevice; virIOMMUFDSupported; # util/viriscsi.h diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index fd400ae8a6..9b459f47ca 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7693,15 +7693,8 @@ qemuProcessOpenIommuFd(virDomainObj *vm) VIR_DEBUG("Opening IOMMU FD for domain %s", vm->def->name); - if ((fd = open(VIR_IOMMU_DEV_PATH, O_RDWR | O_CLOEXEC)) < 0) { - virReportSystemError(errno, "%s", _("cannot open /dev/iommu")); + if ((fd = virIOMMUFDOpenDevice()) < 0) return -1; - } - - if (virIOMMUFDSetRLimitMode(fd, true) < 0) { - VIR_FORCE_CLOSE(fd); - return -1; - } VIR_DEBUG("Opened IOMMU FD %d for domain %s", fd, vm->def->name); return fd; diff --git a/src/util/viriommufd.c b/src/util/viriommufd.c index 44b30029a5..1f3353eab4 100644 --- a/src/util/viriommufd.c +++ b/src/util/viriommufd.c @@ -1,5 +1,7 @@ #include <config.h> +#include <fcntl.h> + #include "viriommufd.h" #include "virlog.h" #include "virerror.h" @@ -54,7 +56,7 @@ struct iommu_option { * * Returns: 0 on success, -1 on error */ -int +static int virIOMMUFDSetRLimitMode(int fd, bool processAccounting) { struct iommu_option option = { @@ -77,10 +79,24 @@ virIOMMUFDSetRLimitMode(int fd, bool processAccounting) return 0; } +int +virIOMMUFDOpenDevice(void) +{ + int fd = -1; + + if ((fd = open(VIR_IOMMU_DEV_PATH, O_RDWR | O_CLOEXEC)) < 0) + virReportSystemError(errno, "%s", _("cannot open IOMMUFD device")); + + if (virIOMMUFDSetRLimitMode(fd, true) < 0) + return -1; + + return fd; +} + #else -int virIOMMUFDSetRLimitMode(int fd G_GNUC_UNUSED, - bool processAccounting G_GNUC_UNUSED) +int +virIOMMUFDOpenDevice(void) { virReportError(VIR_ERR_NO_SUPPORT, "%s", _("IOMMUFD is not supported on this platform")); diff --git a/src/util/viriommufd.h b/src/util/viriommufd.h index ec6be9fa66..223f44eb5c 100644 --- a/src/util/viriommufd.h +++ b/src/util/viriommufd.h @@ -22,6 +22,6 @@ #define VIR_IOMMU_DEV_PATH "/dev/iommu" -int virIOMMUFDSetRLimitMode(int fd, bool processAccounting); +int virIOMMUFDOpenDevice(void); bool virIOMMUFDSupported(void); -- 2.53.0
This will allow us reusing same code for hotplug. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_process.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9b459f47ca..d21abb9eb6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7680,24 +7680,23 @@ qemuProcessPrepareHostBackendChardevHotplug(virDomainObj *vm, /** * qemuProcessOpenIommuFd: * @vm: domain object - * @iommuFd: returned file descriptor * * Opens /dev/iommu file descriptor for the VM. * - * Returns: FD on success, -1 on failure + * Returns: 0 on success, -1 on failure */ static int qemuProcessOpenIommuFd(virDomainObj *vm) { - int fd = -1; + qemuDomainObjPrivate *priv = vm->privateData; VIR_DEBUG("Opening IOMMU FD for domain %s", vm->def->name); - if ((fd = virIOMMUFDOpenDevice()) < 0) + if ((priv->iommufd = virIOMMUFDOpenDevice()) < 0) return -1; - VIR_DEBUG("Opened IOMMU FD %d for domain %s", fd, vm->def->name); - return fd; + VIR_DEBUG("Opened IOMMU FD %d for domain %s", priv->iommufd, vm->def->name); + return 0; } /** @@ -7754,7 +7753,6 @@ qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev) static int qemuProcessOpenVfioFds(virDomainObj *vm) { - qemuDomainObjPrivate *priv = vm->privateData; size_t i; /* Check if we have any hostdevs that need VFIO FDs */ @@ -7772,8 +7770,7 @@ qemuProcessOpenVfioFds(virDomainObj *vm) return -1; /* Open IOMMU FD */ - priv->iommufd = qemuProcessOpenIommuFd(vm); - if (priv->iommufd == -1) + if (qemuProcessOpenIommuFd(vm) < 0) return -1; } } -- 2.53.0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/libvirt_private.syms | 1 + src/qemu/qemu_process.c | 23 +---------------------- src/util/virpci.c | 28 ++++++++++++++++++++++++++++ src/util/virpci.h | 2 ++ 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 576b1f6595..4d29512e0b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3175,6 +3175,7 @@ virPCIDeviceListNew; virPCIDeviceListSteal; virPCIDeviceListStealIndex; virPCIDeviceNew; +virPCIDeviceOpenVfioFd; virPCIDeviceReattach; virPCIDeviceRebind; virPCIDeviceReset; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d21abb9eb6..cc2a9c8abc 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7711,9 +7711,6 @@ qemuProcessOpenIommuFd(virDomainObj *vm) static int qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev) { - g_autofree char *vfioPath = NULL; - int fd = -1; - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -7721,25 +7718,7 @@ qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev) return -1; } - if (virPCIDeviceGetVfioPath(&hostdev->source.subsys.u.pci.addr, &vfioPath) < 0) - return -1; - - VIR_DEBUG("Opening VFIO device %s", vfioPath); - - if ((fd = open(vfioPath, O_RDWR | O_CLOEXEC)) < 0) { - if (errno == ENOENT) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("VFIO device %1$s not found - ensure device is bound to vfio-pci driver"), - vfioPath); - } else { - virReportSystemError(errno, - _("cannot open VFIO device %1$s"), vfioPath); - } - return -1; - } - - VIR_DEBUG("Opened VFIO device FD %d for %s", fd, vfioPath); - return fd; + return virPCIDeviceOpenVfioFd(&hostdev->source.subsys.u.pci.addr); } /** diff --git a/src/util/virpci.c b/src/util/virpci.c index 2348a98003..30feec6dae 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -3359,3 +3359,31 @@ virPCIDeviceGetVfioPath(virPCIDeviceAddress *addr, addrStr); return -1; } + +/** + * virPCIDeviceOpenVfioFd: + * @addr: + * + * Opens VFIO device and returns its FD. + * + * Returns: FD on success, -1 on failure + */ +int +virPCIDeviceOpenVfioFd(virPCIDeviceAddress *addr) +{ + g_autofree char *vfioPath = NULL; + int fd = -1; + + if (virPCIDeviceGetVfioPath(addr, &vfioPath) < 0) + return -1; + + VIR_DEBUG("Opening VFIO device %s", vfioPath); + + if ((fd = open(vfioPath, O_RDWR | O_CLOEXEC)) < 0) { + virReportSystemError(errno, _("cannot open VFIO device %1$s"), vfioPath); + return -1; + } + + VIR_DEBUG("Opened VFIO device FD %d for %s", fd, vfioPath); + return fd; +} diff --git a/src/util/virpci.h b/src/util/virpci.h index 24ede10755..7848567285 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -298,6 +298,8 @@ void virPCIDeviceAddressFree(virPCIDeviceAddress *address); int virPCIDeviceGetVfioPath(virPCIDeviceAddress *addr, char **vfioPath); +int virPCIDeviceOpenVfioFd(virPCIDeviceAddress *addr); + G_DEFINE_AUTOPTR_CLEANUP_FUNC(virPCIDevice, virPCIDeviceFree); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virPCIDeviceAddress, virPCIDeviceAddressFree); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virPCIEDeviceInfo, virPCIEDeviceInfoFree); -- 2.53.0
This will allow us reusing same code for hotplug support. As part of refactor remove redundant checks. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_process.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index cc2a9c8abc..2bab46fca6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7702,23 +7702,21 @@ qemuProcessOpenIommuFd(virDomainObj *vm) /** * qemuProcessOpenVfioDeviceFd: * @hostdev: host device definition - * @vfioFd: returned file descriptor * * Opens the VFIO device file descriptor for a hostdev. * - * Returns: FD on success, -1 on failure + * Returns: 0 on success, -1 on failure */ static int qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev) { - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || - hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("VFIO FD only supported for PCI hostdevs")); + qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev); + virDomainHostdevSubsysPCI *pci = &hostdev->source.subsys.u.pci; + + if ((hostdevPriv->vfioDeviceFd = virPCIDeviceOpenVfioFd(&pci->addr)) < 0) return -1; - } - return virPCIDeviceOpenVfioFd(&hostdev->source.subsys.u.pci.addr); + return 0; } /** @@ -7737,16 +7735,14 @@ qemuProcessOpenVfioFds(virDomainObj *vm) /* Check if we have any hostdevs that need VFIO FDs */ for (i = 0; i < vm->def->nhostdevs; i++) { virDomainHostdevDef *hostdev = vm->def->hostdevs[i]; - qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev); if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && hostdev->source.subsys.u.pci.driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO && hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) { /* Open VFIO device FD */ - hostdevPriv->vfioDeviceFd = qemuProcessOpenVfioDeviceFd(hostdev); - if (hostdevPriv->vfioDeviceFd == -1) - return -1; + if (qemuProcessOpenVfioDeviceFd(hostdev) < 0) + return -1; /* Open IOMMU FD */ if (qemuProcessOpenIommuFd(vm) < 0) -- 2.53.0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/security/security_apparmor.c | 2 +- src/security/security_dac.c | 4 ++-- src/security/security_selinux.c | 4 ++-- src/util/virpci.c | 14 ++++++++------ src/util/virpci.h | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c index 934acfb461..6c5da2a650 100644 --- a/src/security/security_apparmor.c +++ b/src/security/security_apparmor.c @@ -860,7 +860,7 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr, } else { g_autofree char *vfiofdDev = NULL; - if (virPCIDeviceGetVfioPath(&dev->source.subsys.u.pci.addr, &vfiofdDev) < 0) + if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) goto done; ret = AppArmorSetSecurityPCILabel(pci, vfiofdDev, ptr); diff --git a/src/security/security_dac.c b/src/security/security_dac.c index d0ed22db2d..704c8dbfec 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -1295,7 +1295,7 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr, } else { g_autofree char *vfiofdDev = NULL; - if (virPCIDeviceGetVfioPath(&dev->source.subsys.u.pci.addr, &vfiofdDev) < 0) + if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) return -1; ret = virSecurityDACSetHostdevLabelHelper(vfiofdDev, false, &cbdata); @@ -1468,7 +1468,7 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr, } else { g_autofree char *vfiofdDev = NULL; - if (virPCIDeviceGetVfioPath(&dev->source.subsys.u.pci.addr, &vfiofdDev) < 0) + if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) return -1; ret = virSecurityDACRestoreFileLabelInternal(mgr, NULL, diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index 834383a7de..4a5f61d16b 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -2269,7 +2269,7 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr, } else { g_autofree char *vfiofdDev = NULL; - if (virPCIDeviceGetVfioPath(&dev->source.subsys.u.pci.addr, &vfiofdDev) < 0) + if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) return -1; ret = virSecuritySELinuxSetHostdevLabelHelper(vfiofdDev, false, &data); @@ -2515,7 +2515,7 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr, } else { g_autofree char *vfiofdDev = NULL; - if (virPCIDeviceGetVfioPath(&dev->source.subsys.u.pci.addr, &vfiofdDev) < 0) + if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0) return -1; ret = virSecuritySELinuxRestoreFileLabel(mgr, vfiofdDev, false, false); diff --git a/src/util/virpci.c b/src/util/virpci.c index 30feec6dae..78c47869ef 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -3331,19 +3331,17 @@ virPCIDeviceAddressFree(virPCIDeviceAddress *address) * Returns: 0 on success, -1 on failure */ int -virPCIDeviceGetVfioPath(virPCIDeviceAddress *addr, +virPCIDeviceGetVfioPath(virPCIDevice *pci, char **vfioPath) { - g_autofree char *addrStr = NULL; g_autofree char *sysfsPath = NULL; g_autoptr(DIR) dir = NULL; struct dirent *entry = NULL; *vfioPath = NULL; - addrStr = virPCIDeviceAddressAsString(addr); /* Look in device's vfio-dev subdirectory */ - sysfsPath = g_strdup_printf("/sys/bus/pci/devices/%s/vfio-dev/", addrStr); + sysfsPath = virPCIFile(pci->name, "vfio-dev"); if (virDirOpen(&dir, sysfsPath) == 1) { while (virDirRead(dir, &entry, sysfsPath) > 0) { @@ -3356,7 +3354,7 @@ virPCIDeviceGetVfioPath(virPCIDeviceAddress *addr, virReportError(VIR_ERR_INTERNAL_ERROR, _("cannot find VFIO device for PCI device %1$s"), - addrStr); + pci->name); return -1; } @@ -3371,10 +3369,14 @@ virPCIDeviceGetVfioPath(virPCIDeviceAddress *addr, int virPCIDeviceOpenVfioFd(virPCIDeviceAddress *addr) { + g_autoptr(virPCIDevice) pci = NULL; g_autofree char *vfioPath = NULL; int fd = -1; - if (virPCIDeviceGetVfioPath(addr, &vfioPath) < 0) + if (!(pci = virPCIDeviceNew(addr))) + return -1; + + if (virPCIDeviceGetVfioPath(pci, &vfioPath) < 0) return -1; VIR_DEBUG("Opening VFIO device %s", vfioPath); diff --git a/src/util/virpci.h b/src/util/virpci.h index 7848567285..933099da6c 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -296,7 +296,7 @@ void virPCIEDeviceInfoFree(virPCIEDeviceInfo *dev); void virPCIDeviceAddressFree(virPCIDeviceAddress *address); -int virPCIDeviceGetVfioPath(virPCIDeviceAddress *addr, char **vfioPath); +int virPCIDeviceGetVfioPath(virPCIDevice *pci, char **vfioPath); int virPCIDeviceOpenVfioFd(virPCIDeviceAddress *addr); -- 2.53.0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/conf/domain_conf.c | 15 +++++++++++++++ src/conf/domain_conf.h | 3 +++ src/libvirt_private.syms | 1 + src/qemu/qemu_process.c | 5 +---- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index e3c69aee4d..98d34f408d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -32939,6 +32939,21 @@ virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev) } +/** + * virHostdevIsPCIDeviceWithIOMMUFD: + * @hostdev: host device to check + * + * Returns true if @hostdev is a PCI device with IOMMUFD enabled, false otherwise. + */ +bool +virHostdevIsPCIDeviceWithIOMMUFD(const virDomainHostdevDef *hostdev) +{ + return virHostdevIsPCIDevice(hostdev) && + hostdev->source.subsys.u.pci.driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO && + hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES; +} + + static void virDomainObjGetMessagesIOErrorsSrc(virStorageSource *src, const char *diskdst, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index be96617981..f98fed650a 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -4720,6 +4720,9 @@ virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev) bool virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev) ATTRIBUTE_NONNULL(1); +bool +virHostdevIsPCIDeviceWithIOMMUFD(const virDomainHostdevDef *hostdev) + ATTRIBUTE_NONNULL(1); void virDomainObjGetMessagesIOErrorsChain(virStorageSource *src, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 4d29512e0b..15a56a262a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -813,6 +813,7 @@ virDomainQemuMonitorEventNew; virDomainQemuMonitorEventStateRegisterID; virHostdevIsMdevDevice; virHostdevIsPCIDevice; +virHostdevIsPCIDeviceWithIOMMUFD; virHostdevIsSCSIDevice; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 2bab46fca6..cfc30dcbe4 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7736,10 +7736,7 @@ qemuProcessOpenVfioFds(virDomainObj *vm) for (i = 0; i < vm->def->nhostdevs; i++) { virDomainHostdevDef *hostdev = vm->def->hostdevs[i]; - if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && - hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && - hostdev->source.subsys.u.pci.driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO && - hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) { + if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { /* Open VFIO device FD */ if (qemuProcessOpenVfioDeviceFd(hostdev) < 0) return -1; -- 2.53.0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/conf/domain_conf.c | 14 ++++++++++++++ src/conf/domain_conf.h | 3 +++ src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 42 ++++++++++++---------------------------- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 98d34f408d..453e301041 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -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) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index f98fed650a..a13f6d79e9 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -4662,6 +4662,9 @@ virDomainDefHasNVMeDisk(const virDomainDef *def); bool virDomainDefHasPCIHostdev(const virDomainDef *def); +bool +virDomainDefHasPCIHostdevWithIOMMUFD(const virDomainDef *def); + bool virDomainDefHasMdevHostdev(const virDomainDef *def); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 15a56a262a..d8ae4f46cd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -348,6 +348,7 @@ virDomainDefHasNVMeDisk; virDomainDefHasOldStyleROUEFI; virDomainDefHasOldStyleUEFI; virDomainDefHasPCIHostdev; +virDomainDefHasPCIHostdevWithIOMMUFD; virDomainDefHasTimer; virDomainDefHasUSB; virDomainDefHasVcpusOffline; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c09c883a28..f400835332 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -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; + virCommandPassFD(cmd, priv->iommufd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) - continue; + priv->iommufd = -1; - if (subsys->type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) - continue; + if (qemuMonitorCreateObjectProps(&props, "iommufd", + "iommufd0", + "S:fd", fdstr, + NULL) < 0) + return -1; - 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); - - priv->iommufd = -1; - - if (qemuMonitorCreateObjectProps(&props, "iommufd", - "iommufd0", - "S:fd", fdstr, - NULL) < 0) - return -1; - - if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0) - return -1; - - break; - } + if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0) + return -1; return 0; } -- 2.53.0
If starting VM fails we would leak the FD for IOMMU device. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_domain.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index bdab117e96..64b01e524f 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1975,6 +1975,8 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivate *priv) priv->migrationRecoverSetup = false; + VIR_FORCE_CLOSE(priv->iommufd); + g_clear_pointer(&priv->memoryBackingDir, g_free); } -- 2.53.0
We would open IOMMU device for each host device with IOMMUFD backend leaking FD except for the last one. Since we are adding only single iommufd object we need to open it only once. Fixes: 2f0999a161910e3992458902ce90d37f8b8f2642 Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_process.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index cfc30dcbe4..1ca0ed1b9b 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7740,13 +7740,15 @@ qemuProcessOpenVfioFds(virDomainObj *vm) /* Open VFIO device FD */ if (qemuProcessOpenVfioDeviceFd(hostdev) < 0) return -1; - - /* Open IOMMU FD */ - if (qemuProcessOpenIommuFd(vm) < 0) - return -1; } } + /* Open IOMMU FD */ + if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def) && + qemuProcessOpenIommuFd(vm) < 0) { + return -1; + } + return 0; } -- 2.53.0
Follow our switch pattern to simplify the code logic and rename the function to follow our naming pattern. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_process.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 1ca0ed1b9b..c5c1ef77ec 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7719,27 +7719,28 @@ qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev) return 0; } -/** - * qemuProcessOpenVfioFds: - * @vm: domain object - * - * Opens all necessary VFIO file descriptors for the domain. - * - * Returns: 0 on success, -1 on failure - */ static int -qemuProcessOpenVfioFds(virDomainObj *vm) +qemuProcessPrepareHostHostdev(virDomainObj *vm) { size_t i; - /* Check if we have any hostdevs that need VFIO FDs */ for (i = 0; i < vm->def->nhostdevs; i++) { virDomainHostdevDef *hostdev = vm->def->hostdevs[i]; - if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { - /* Open VFIO device FD */ - if (qemuProcessOpenVfioDeviceFd(hostdev) < 0) - return -1; + switch (hostdev->source.subsys.type) { + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { + /* Open VFIO device FD */ + if (qemuProcessOpenVfioDeviceFd(hostdev) < 0) + return -1; + } + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + break; } } @@ -7807,7 +7808,7 @@ qemuProcessPrepareHost(virQEMUDriver *driver, hostdev_flags |= VIR_HOSTDEV_COLD_BOOT; if (qemuHostdevPrepareDomainDevices(driver, vm->def, hostdev_flags) < 0) return -1; - if (qemuProcessOpenVfioFds(vm) < 0) + if (qemuProcessPrepareHostHostdev(vm) < 0) return -1; VIR_DEBUG("Preparing chr device backends"); -- 2.53.0
Create a single place for host device preparation code. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- tests/qemuxmlconftest.c | 71 ++++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index 5fddf3a523..321c444d77 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -378,6 +378,54 @@ testSetupHostdevPrivateData(virDomainDef *def) } +static void +testQemuPrepareHostdevUSB(virDomainHostdevDef *hostdev) +{ + virDomainHostdevSubsysUSB *usb = &hostdev->source.subsys.u.usb; + + if (!usb->device && !usb->bus) { + if (usb->vendor == 0x1234 && usb->product == 0x4321) { + usb->bus = 42; + usb->device = 0x1234; + } else { + g_assert_not_reached(); + } + } else if (!usb->device && !usb->vendor && !usb->product) { + if (usb->bus == 2 && STREQ(usb->port, "3")) { + usb->device = 4; + } else { + g_assert_not_reached(); + } + } +} + + +static void +testQemuPrepareHostdev(virDomainObj *vm) +{ + size_t i; + + for (i = 0; i < vm->def->nhostdevs; i++) { + virDomainHostdevDef *hostdev = vm->def->hostdevs[i]; + + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) + continue; + + switch (hostdev->source.subsys.type) { + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: + testQemuPrepareHostdevUSB(hostdev); + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + break; + } + } +} + + static virNetworkDriver fakeNetworkDriver = { .networkLookupByName = fakeNetworkLookupByName, .networkGetXMLDesc = fakeNetworkGetXMLDesc, @@ -524,28 +572,7 @@ testCompareXMLToArgvCreateArgs(virQEMUDriver *drv, } } - for (i = 0; i < vm->def->nhostdevs; i++) { - virDomainHostdevDef *hostdev = vm->def->hostdevs[i]; - - if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && - hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) { - virDomainHostdevSubsysUSB *usb = &hostdev->source.subsys.u.usb; - if (!usb->device && !usb->bus) { - if (usb->vendor == 0x1234 && usb->product == 0x4321) { - usb->bus = 42; - usb->device = 0x1234; - } else { - g_assert_not_reached(); - } - } else if (!usb->device && !usb->vendor && !usb->product) { - if (usb->bus == 2 && STREQ(usb->port, "3")) { - usb->device = 4; - } else { - g_assert_not_reached(); - } - } - } - } + testQemuPrepareHostdev(vm); if (flags & FLAG_SLIRP_HELPER) { for (i = 0; i < vm->def->nnets; i++) { -- 2.53.0
There is no need to call qemuDomainHostdevPrivateNew() because privateData is allocated on creation by virDomainHostdevDefNew(). Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- tests/qemuxmlconftest.c | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index 321c444d77..a04311647e 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -352,28 +352,13 @@ fakeNetworkPortGetXMLDesc(virNetworkPortPtr port, static void -testSetupHostdevPrivateData(virDomainDef *def) +testQemuPrepareHostdevPCI(virDomainHostdevDef *hostdev) { - size_t i; + qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev); - for (i = 0; i < def->nhostdevs; i++) { - virDomainHostdevDef *hostdev = def->hostdevs[i]; - - if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && - hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && - hostdev->source.subsys.u.pci.driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO && - hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) { - - qemuDomainHostdevPrivate *priv; - - if (!hostdev->privateData) { - hostdev->privateData = qemuDomainHostdevPrivateNew(); - } - - priv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev); - /* Use a placeholder FD value for tests */ - priv->vfioDeviceFd = 0; - } + if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { + /* Use a placeholder FD value for tests */ + hostdevPriv->vfioDeviceFd = 0; } } @@ -416,6 +401,8 @@ testQemuPrepareHostdev(virDomainObj *vm) testQemuPrepareHostdevUSB(hostdev); break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + testQemuPrepareHostdevPCI(hostdev); + break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: @@ -479,8 +466,6 @@ testCompareXMLToArgvCreateArgs(virQEMUDriver *drv, if (testQemuPrepareHostBackendChardevOne(NULL, priv->monConfig, vm) < 0) return NULL; - testSetupHostdevPrivateData(vm->def); - for (i = 0; i < vm->def->ndisks; i++) { virDomainDiskDef *disk = vm->def->disks[i]; virStorageSource *src; -- 2.53.0
Same as for VFIO FD for host device. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- tests/qemuxmlconfdata/iommufd-q35.x86_64-latest.args | 2 +- .../iommufd-virt-pci-bus-single.aarch64-latest.args | 2 +- tests/qemuxmlconfdata/iommufd-virt.aarch64-latest.args | 2 +- tests/qemuxmlconfdata/iommufd.x86_64-latest.args | 2 +- tests/qemuxmlconftest.c | 4 ++++ 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/qemuxmlconfdata/iommufd-q35.x86_64-latest.args b/tests/qemuxmlconfdata/iommufd-q35.x86_64-latest.args index 7d819e141b..d5fe704021 100644 --- a/tests/qemuxmlconfdata/iommufd-q35.x86_64-latest.args +++ b/tests/qemuxmlconfdata/iommufd-q35.x86_64-latest.args @@ -35,7 +35,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-q35-test/.config \ -device '{"driver":"qxl-vga","id":"video0","max_outputs":1,"ram_size":67108864,"vram_size":33554432,"vram64_size_mb":0,"vgamem_mb":8,"bus":"pcie.0","addr":"0x1"}' \ -global ICH9-LPC.noreboot=off \ -watchdog-action reset \ --object '{"qom-type":"iommufd","id":"iommufd0","fd":"-1"}' \ +-object '{"qom-type":"iommufd","id":"iommufd0","fd":"0"}' \ -device '{"driver":"vfio-pci","host":"0000:06:12.5","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pcie.0","addr":"0x3"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ -msg timestamp=on diff --git a/tests/qemuxmlconfdata/iommufd-virt-pci-bus-single.aarch64-latest.args b/tests/qemuxmlconfdata/iommufd-virt-pci-bus-single.aarch64-latest.args index 9a04e97351..303cfa922b 100644 --- a/tests/qemuxmlconfdata/iommufd-virt-pci-bus-single.aarch64-latest.args +++ b/tests/qemuxmlconfdata/iommufd-virt-pci-bus-single.aarch64-latest.args @@ -26,7 +26,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-foo/.config \ -no-shutdown \ -boot strict=on \ -audiodev '{"id":"audio1","driver":"none"}' \ --object '{"qom-type":"iommufd","id":"iommufd0","fd":"-1"}' \ +-object '{"qom-type":"iommufd","id":"iommufd0","fd":"0"}' \ -device '{"driver":"vfio-pci","host":"0000:06:12.5","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pcie.0","addr":"0x1"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ -msg timestamp=on diff --git a/tests/qemuxmlconfdata/iommufd-virt.aarch64-latest.args b/tests/qemuxmlconfdata/iommufd-virt.aarch64-latest.args index 039ae4477c..6a62b08e8a 100644 --- a/tests/qemuxmlconfdata/iommufd-virt.aarch64-latest.args +++ b/tests/qemuxmlconfdata/iommufd-virt.aarch64-latest.args @@ -29,7 +29,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-foo/.config \ -device '{"driver":"pcie-root-port","port":9,"chassis":2,"id":"pci.2","bus":"pcie.0","addr":"0x1.0x1"}' \ -device '{"driver":"pcie-root-port","port":10,"chassis":3,"id":"pci.3","bus":"pcie.0","addr":"0x1.0x2"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ --object '{"qom-type":"iommufd","id":"iommufd0","fd":"-1"}' \ +-object '{"qom-type":"iommufd","id":"iommufd0","fd":"0"}' \ -device '{"driver":"vfio-pci","host":"0000:06:12.5","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pci.1","addr":"0x0"}' \ -device '{"driver":"vfio-pci","host":"0000:07:12.5","id":"hostdev1","iommufd":"iommufd0","fd":"0","bus":"pci.2","addr":"0x0"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ diff --git a/tests/qemuxmlconfdata/iommufd.x86_64-latest.args b/tests/qemuxmlconfdata/iommufd.x86_64-latest.args index 3130ba2e3a..15dabe197c 100644 --- a/tests/qemuxmlconfdata/iommufd.x86_64-latest.args +++ b/tests/qemuxmlconfdata/iommufd.x86_64-latest.args @@ -28,7 +28,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-foo/.config \ -boot strict=on \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ --object '{"qom-type":"iommufd","id":"iommufd0","fd":"-1"}' \ +-object '{"qom-type":"iommufd","id":"iommufd0","fd":"0"}' \ -device '{"driver":"vfio-pci","host":"0000:06:12.5","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pci.0","addr":"0x3"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index a04311647e..4ab004a954 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -388,6 +388,7 @@ testQemuPrepareHostdevUSB(virDomainHostdevDef *hostdev) static void testQemuPrepareHostdev(virDomainObj *vm) { + qemuDomainObjPrivate *priv = QEMU_DOMAIN_PRIVATE(vm); size_t i; for (i = 0; i < vm->def->nhostdevs; i++) { @@ -410,6 +411,9 @@ testQemuPrepareHostdev(virDomainObj *vm) break; } } + + if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def)) + priv->iommufd = 0; } -- 2.53.0
This cleans up creating QEMU command line and makes it easier when adding hotplug support. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_command.c | 7 ++----- src/qemu/qemu_domain.c | 4 ++-- src/qemu/qemu_domain.h | 2 +- src/qemu/qemu_process.c | 6 ++++-- tests/qemuxmlconftest.c | 6 ++++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f400835332..204fdf152b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -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; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 64b01e524f..d9cd9324e0 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -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 */ diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 510a8339b0..c6430b1bfb 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -264,7 +264,7 @@ struct _qemuDomainObjPrivate { /* named file descriptor groups associated with the VM */ GHashTable *fds; - int iommufd; + qemuFDPassDirect *iommufd; char *memoryBackingDir; }; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index c5c1ef77ec..c814f992bb 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -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; } diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index 4ab004a954..13055eef84 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -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); + } } -- 2.53.0
This cleans up creating QEMU command line and makes it easier when adding hotplug support. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_command.c | 15 +++++---------- src/qemu/qemu_domain.c | 4 ++-- src/qemu/qemu_domain.h | 2 +- src/qemu/qemu_process.c | 6 +++++- tests/qemuxmlconftest.c | 4 +++- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 204fdf152b..91eb3cb27d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -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))) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index d9cd9324e0..ada9d3431c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -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; } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index c6430b1bfb..fa7d4ab40f 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -463,7 +463,7 @@ struct _qemuDomainHostdevPrivate { virObject parent; /* VFIO device file descriptor for iommufd passthrough */ - int vfioDeviceFd; + qemuFDPassDirect *vfioDeviceFd; }; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index c814f992bb..fc7e7bc980 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -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; } diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index 13055eef84..d2ab4a71b5 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -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); } } -- 2.53.0
They should not be used at the same time. Fixes: f6230804727df834da27370e835204672218ab23 Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_command.c | 24 +++++++++---------- .../iommufd-q35.x86_64-latest.args | 2 +- ...fd-virt-pci-bus-single.aarch64-latest.args | 2 +- .../iommufd-virt.aarch64-latest.args | 4 ++-- .../iommufd.x86_64-latest.args | 2 +- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 91eb3cb27d..724f0cd8eb 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4762,10 +4762,11 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def, g_autoptr(virJSONValue) props = NULL; virDomainHostdevSubsysPCI *pcisrc = &dev->source.subsys.u.pci; virDomainNetTeamingInfo *teaming; - g_autofree char *host = virPCIDeviceAddressAsString(&pcisrc->addr); + g_autofree char *host = NULL; const char *failover_pair_id = NULL; const char *driver = NULL; const char *iommufdId = NULL; + const char *fdstr = NULL; /* 'ramfb' property must be omitted unless it's to be enabled */ bool ramfb = pcisrc->ramfb == VIR_TRISTATE_SWITCH_ON; @@ -4799,31 +4800,28 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def, teaming->persistent) failover_pair_id = teaming->persistent; - if (pcisrc->driver.iommufd == VIR_TRISTATE_BOOL_YES) + if (virHostdevIsPCIDeviceWithIOMMUFD(dev)) { + qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(dev); + + fdstr = qemuFDPassDirectGetPath(hostdevPriv->vfioDeviceFd); iommufdId = "iommufd0"; + } else { + host = virPCIDeviceAddressAsString(&pcisrc->addr); + } if (virJSONValueObjectAdd(&props, "s:driver", driver, - "s:host", host, + "S:host", host, "s:id", dev->info->alias, "p:bootindex", dev->info->effectiveBootIndex, "S:failover_pair_id", failover_pair_id, "S:display", qemuOnOffAuto(pcisrc->display), "B:ramfb", ramfb, "S:iommufd", iommufdId, + "S:fd", fdstr, NULL) < 0) return NULL; - if (pcisrc->driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO && - pcisrc->driver.iommufd == VIR_TRISTATE_BOOL_YES) { - qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(dev); - - if (virJSONValueObjectAdd(&props, - "S:fd", qemuFDPassDirectGetPath(hostdevPriv->vfioDeviceFd), - NULL) < 0) - return NULL; - } - if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0) return NULL; diff --git a/tests/qemuxmlconfdata/iommufd-q35.x86_64-latest.args b/tests/qemuxmlconfdata/iommufd-q35.x86_64-latest.args index d5fe704021..f886c488e1 100644 --- a/tests/qemuxmlconfdata/iommufd-q35.x86_64-latest.args +++ b/tests/qemuxmlconfdata/iommufd-q35.x86_64-latest.args @@ -36,6 +36,6 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-q35-test/.config \ -global ICH9-LPC.noreboot=off \ -watchdog-action reset \ -object '{"qom-type":"iommufd","id":"iommufd0","fd":"0"}' \ --device '{"driver":"vfio-pci","host":"0000:06:12.5","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pcie.0","addr":"0x3"}' \ +-device '{"driver":"vfio-pci","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pcie.0","addr":"0x3"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ -msg timestamp=on diff --git a/tests/qemuxmlconfdata/iommufd-virt-pci-bus-single.aarch64-latest.args b/tests/qemuxmlconfdata/iommufd-virt-pci-bus-single.aarch64-latest.args index 303cfa922b..543e976c58 100644 --- a/tests/qemuxmlconfdata/iommufd-virt-pci-bus-single.aarch64-latest.args +++ b/tests/qemuxmlconfdata/iommufd-virt-pci-bus-single.aarch64-latest.args @@ -27,6 +27,6 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-foo/.config \ -boot strict=on \ -audiodev '{"id":"audio1","driver":"none"}' \ -object '{"qom-type":"iommufd","id":"iommufd0","fd":"0"}' \ --device '{"driver":"vfio-pci","host":"0000:06:12.5","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pcie.0","addr":"0x1"}' \ +-device '{"driver":"vfio-pci","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pcie.0","addr":"0x1"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ -msg timestamp=on diff --git a/tests/qemuxmlconfdata/iommufd-virt.aarch64-latest.args b/tests/qemuxmlconfdata/iommufd-virt.aarch64-latest.args index 6a62b08e8a..e1a4c4bb9a 100644 --- a/tests/qemuxmlconfdata/iommufd-virt.aarch64-latest.args +++ b/tests/qemuxmlconfdata/iommufd-virt.aarch64-latest.args @@ -30,7 +30,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-foo/.config \ -device '{"driver":"pcie-root-port","port":10,"chassis":3,"id":"pci.3","bus":"pcie.0","addr":"0x1.0x2"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -object '{"qom-type":"iommufd","id":"iommufd0","fd":"0"}' \ --device '{"driver":"vfio-pci","host":"0000:06:12.5","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pci.1","addr":"0x0"}' \ --device '{"driver":"vfio-pci","host":"0000:07:12.5","id":"hostdev1","iommufd":"iommufd0","fd":"0","bus":"pci.2","addr":"0x0"}' \ +-device '{"driver":"vfio-pci","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pci.1","addr":"0x0"}' \ +-device '{"driver":"vfio-pci","id":"hostdev1","iommufd":"iommufd0","fd":"0","bus":"pci.2","addr":"0x0"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ -msg timestamp=on diff --git a/tests/qemuxmlconfdata/iommufd.x86_64-latest.args b/tests/qemuxmlconfdata/iommufd.x86_64-latest.args index 15dabe197c..b9aefda39d 100644 --- a/tests/qemuxmlconfdata/iommufd.x86_64-latest.args +++ b/tests/qemuxmlconfdata/iommufd.x86_64-latest.args @@ -29,7 +29,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-foo/.config \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -object '{"qom-type":"iommufd","id":"iommufd0","fd":"0"}' \ --device '{"driver":"vfio-pci","host":"0000:06:12.5","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pci.0","addr":"0x3"}' \ +-device '{"driver":"vfio-pci","id":"hostdev0","iommufd":"iommufd0","fd":"0","bus":"pci.0","addr":"0x3"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ -msg timestamp=on -- 2.53.0
We need to track if iommufd object was added to the VM when we add hotplug support. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_command.c | 2 ++ src/qemu/qemu_domain.c | 6 ++++++ src/qemu/qemu_domain.h | 1 + 3 files changed, 9 insertions(+) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 724f0cd8eb..cdf2f91ece 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5366,6 +5366,8 @@ qemuBuildIOMMUFDCommandLine(virCommand *cmd, if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0) return -1; + priv->iommufdState = true; + return 0; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ada9d3431c..ccbfc8bac7 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1976,6 +1976,7 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivate *priv) priv->migrationRecoverSetup = false; g_clear_pointer(&priv->iommufd, qemuFDPassDirectFree); + priv->iommufdState = false; g_clear_pointer(&priv->memoryBackingDir, g_free); } @@ -2844,6 +2845,9 @@ qemuDomainObjPrivateXMLFormat(virBuffer *buf, priv->preMigrationMemlock); } + if (priv->iommufdState) + virBufferAddLit(buf, "<iommufd/>\n"); + return 0; } @@ -3582,6 +3586,8 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, return -1; } + priv->iommufdState = virXPathBoolean("boolean(./iommufd)", ctxt) == 1; + return 0; } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index fa7d4ab40f..5755d2adb0 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -265,6 +265,7 @@ struct _qemuDomainObjPrivate { GHashTable *fds; qemuFDPassDirect *iommufd; + bool iommufdState; /* true if --object iommufd was added */ char *memoryBackingDir; }; -- 2.53.0
When removing last host device using IOMMUFD remove the iommufd object as well. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_hotplug.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index d17370b582..24fbccccf0 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4997,6 +4997,14 @@ qemuDomainRemoveHostDevice(virQEMUDriver *driver, } } + if (priv->iommufdState && + !virDomainDefHasPCIHostdevWithIOMMUFD(vm->def)) { + qemuDomainObjEnterMonitor(vm); + ignore_value(qemuMonitorDelObject(priv->mon, "iommufd0", false)); + qemuDomainObjExitMonitor(vm); + priv->iommufdState = false; + } + virDomainAuditHostdev(vm, hostdev, "detach", true); if (!virHostdevIsPCIDevice(hostdev) && -- 2.53.0
This will be reused by hotplug code. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_command.c | 20 ++++++++++++++++---- src/qemu/qemu_command.h | 3 +++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index cdf2f91ece..a742998e4c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5344,6 +5344,21 @@ qemuBuildHostdevCommandLine(virCommand *cmd, } +virJSONValue * +qemuBuildIOMMUFDProps(qemuFDPassDirect *iommufd) +{ + g_autoptr(virJSONValue) props = NULL; + + if (qemuMonitorCreateObjectProps(&props, "iommufd", + "iommufd0", + "S:fd", qemuFDPassDirectGetPath(iommufd), + NULL) < 0) + return NULL; + + return g_steal_pointer(&props); +} + + static int qemuBuildIOMMUFDCommandLine(virCommand *cmd, const virDomainDef *def, @@ -5357,10 +5372,7 @@ qemuBuildIOMMUFDCommandLine(virCommand *cmd, qemuFDPassDirectTransferCommand(priv->iommufd, cmd); - if (qemuMonitorCreateObjectProps(&props, "iommufd", - "iommufd0", - "S:fd", qemuFDPassDirectGetPath(priv->iommufd), - NULL) < 0) + if (!(props = qemuBuildIOMMUFDProps(priv->iommufd))) return -1; if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index ad068f1f16..028d002ef9 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -190,6 +190,9 @@ int qemuBuildRNGBackendProps(virDomainRNGDef *rng, virJSONValue **props); +virJSONValue * +qemuBuildIOMMUFDProps(qemuFDPassDirect *iommufd); + /* Current, best practice */ virJSONValue * qemuBuildUSBHostdevDevProps(const virDomainDef *def, -- 2.53.0
For first host device we need to add iommufd object as well. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_hotplug.c | 39 +++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_process.c | 4 ++-- src/qemu/qemu_process.h | 3 +++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 24fbccccf0..bede4e3ccd 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1553,13 +1553,16 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver, virDomainDeviceDef dev = { VIR_DOMAIN_DEVICE_HOSTDEV, { .hostdev = hostdev } }; virDomainDeviceInfo *info = hostdev->info; + qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev); int ret; g_autoptr(virJSONValue) devprops = NULL; + g_autoptr(virJSONValue) objprops = NULL; bool releaseaddr = false; bool teardowncgroup = false; bool teardownlabel = false; bool teardowndevice = false; bool teardownmemlock = false; + bool removeiommufd = false; g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); unsigned int flags = 0; @@ -1609,11 +1612,38 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver, goto error; } + if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) { + if (qemuProcessOpenVfioDeviceFd(hostdev) < 0) + goto error; + + if (!priv->iommufdState) { + if (qemuProcessOpenIommuFd(vm) < 0) + goto error; + + if (!(objprops = qemuBuildIOMMUFDProps(priv->iommufd))) + goto error; + } + } + if (!(devprops = qemuBuildPCIHostdevDevProps(vm->def, hostdev))) goto error; qemuDomainObjEnterMonitor(vm); + if (objprops) { + if ((ret = qemuFDPassDirectTransferMonitor(priv->iommufd, priv->mon)) < 0) + goto exit_monitor; + + if ((ret = qemuMonitorAddObject(priv->mon, &objprops, NULL)) < 0) + goto exit_monitor; + + priv->iommufdState = true; + removeiommufd = true; + } + + if ((ret = qemuFDPassDirectTransferMonitor(hostdevPriv->vfioDeviceFd, priv->mon)) < 0) + goto exit_monitor; + if ((ret = qemuDomainAttachExtensionDevice(priv->mon, hostdev->info)) < 0) goto exit_monitor; @@ -1644,6 +1674,15 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver, if (teardownmemlock && qemuDomainAdjustMaxMemLock(vm) < 0) VIR_WARN("Unable to reset maximum locked memory on hotplug fail"); + if (removeiommufd) { + qemuDomainObjEnterMonitor(vm); + ignore_value(qemuMonitorDelObject(priv->mon, "iommufd0", false)); + qemuDomainObjExitMonitor(vm); + } + + qemuFDPassDirectTransferMonitorRollback(hostdevPriv->vfioDeviceFd, priv->mon); + qemuFDPassDirectTransferMonitorRollback(priv->iommufd, priv->mon); + if (releaseaddr) qemuDomainReleaseDeviceAddress(vm, info); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index fc7e7bc980..371b64faac 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7685,7 +7685,7 @@ qemuProcessPrepareHostBackendChardevHotplug(virDomainObj *vm, * * Returns: 0 on success, -1 on failure */ -static int +int qemuProcessOpenIommuFd(virDomainObj *vm) { qemuDomainObjPrivate *priv = vm->privateData; @@ -7709,7 +7709,7 @@ qemuProcessOpenIommuFd(virDomainObj *vm) * * Returns: 0 on success, -1 on failure */ -static int +int qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev) { qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev); diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index 6ba846b7b1..fccd41e1a6 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -134,6 +134,9 @@ int qemuProcessPrepareHostBackendChardevHotplug(virDomainObj *vm, virDomainDeviceDef *dev) ATTRIBUTE_MOCKABLE; +int qemuProcessOpenIommuFd(virDomainObj *vm); + +int qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev); int qemuProcessPrepareHost(virQEMUDriver *driver, virDomainObj *vm, -- 2.53.0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- docs/formatdomaincaps.rst | 7 +++++++ src/conf/domain_capabilities.c | 1 + src/conf/domain_capabilities.h | 1 + 3 files changed, 9 insertions(+) diff --git a/docs/formatdomaincaps.rst b/docs/formatdomaincaps.rst index 8b4f0ecff3..6ba7f84f96 100644 --- a/docs/formatdomaincaps.rst +++ b/docs/formatdomaincaps.rst @@ -461,6 +461,10 @@ Well, only if the following is enabled: <value>vfio</value> <value>xen</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> </devices> </domainCapabilities> @@ -477,6 +481,9 @@ Well, only if the following is enabled: ``mode="capabilities"``. ``pciBackend`` Options for the ``name`` attribute of the <driver/> element. +``iommufd`` + Options for the ``iommufd`` attribute of the <driver/> element. + :since:`Since 12.1.0` RNG device ^^^^^^^^^^ diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index f843124695..49179b97ab 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -620,6 +620,7 @@ virDomainCapsDeviceHostdevFormat(virBuffer *buf, ENUM_PROCESS(hostdev, subsysType, virDomainHostdevSubsysTypeToString); ENUM_PROCESS(hostdev, capsType, virDomainHostdevCapsTypeToString); ENUM_PROCESS(hostdev, pciBackend, virDeviceHostdevPCIDriverNameTypeToString); + ENUM_PROCESS(hostdev, iommufd, virTristateBoolTypeToString); FORMAT_EPILOGUE(hostdev); } diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index 437981c711..b10370db8f 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -108,6 +108,7 @@ struct _virDomainCapsDeviceHostdev { virDomainCapsEnum subsysType; /* Info about virDomainHostdevSubsysType */ virDomainCapsEnum capsType; /* Info about virDomainHostdevCapsType */ virDomainCapsEnum pciBackend; /* Info about virDomainHostdevSubsysPCIBackendType */ + virDomainCapsEnum iommufd; /* Info about iommufd:virTristateBool */ /* add new fields here */ }; -- 2.53.0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/qemu/qemu_capabilities.c | 21 ++++++++++++++----- .../qemu_10.0.0-q35.x86_64+amdsev.xml | 4 ++++ .../domaincapsdata/qemu_10.0.0-q35.x86_64.xml | 4 ++++ .../qemu_10.0.0-tcg.x86_64+amdsev.xml | 4 ++++ .../domaincapsdata/qemu_10.0.0-tcg.x86_64.xml | 4 ++++ .../qemu_10.0.0-virt.aarch64.xml | 4 ++++ tests/domaincapsdata/qemu_10.0.0.aarch64.xml | 4 ++++ tests/domaincapsdata/qemu_10.0.0.ppc64.xml | 3 +++ tests/domaincapsdata/qemu_10.0.0.s390x.xml | 4 ++++ .../qemu_10.0.0.x86_64+amdsev.xml | 4 ++++ tests/domaincapsdata/qemu_10.0.0.x86_64.xml | 4 ++++ .../qemu_10.1.0-q35.x86_64+inteltdx.xml | 4 ++++ .../domaincapsdata/qemu_10.1.0-q35.x86_64.xml | 4 ++++ .../qemu_10.1.0-tcg.x86_64+inteltdx.xml | 4 ++++ .../domaincapsdata/qemu_10.1.0-tcg.x86_64.xml | 4 ++++ tests/domaincapsdata/qemu_10.1.0.s390x.xml | 4 ++++ .../qemu_10.1.0.x86_64+inteltdx.xml | 4 ++++ tests/domaincapsdata/qemu_10.1.0.x86_64.xml | 4 ++++ .../qemu_10.2.0-q35.x86_64+mshv.xml | 4 ++++ .../domaincapsdata/qemu_10.2.0-q35.x86_64.xml | 4 ++++ .../qemu_10.2.0-tcg.x86_64+mshv.xml | 4 ++++ .../domaincapsdata/qemu_10.2.0-tcg.x86_64.xml | 4 ++++ .../qemu_10.2.0-virt.aarch64.xml | 4 ++++ tests/domaincapsdata/qemu_10.2.0.aarch64.xml | 4 ++++ .../qemu_10.2.0.x86_64+mshv.xml | 4 ++++ tests/domaincapsdata/qemu_10.2.0.x86_64.xml | 4 ++++ .../domaincapsdata/qemu_11.0.0-q35.x86_64.xml | 4 ++++ .../domaincapsdata/qemu_11.0.0-tcg.x86_64.xml | 4 ++++ .../qemu_11.0.0-virt.aarch64.xml | 4 ++++ tests/domaincapsdata/qemu_11.0.0.aarch64.xml | 4 ++++ tests/domaincapsdata/qemu_11.0.0.x86_64.xml | 4 ++++ .../domaincapsdata/qemu_6.2.0-q35.x86_64.xml | 3 +++ .../domaincapsdata/qemu_6.2.0-tcg.x86_64.xml | 3 +++ tests/domaincapsdata/qemu_6.2.0.ppc64.xml | 3 +++ tests/domaincapsdata/qemu_6.2.0.x86_64.xml | 3 +++ .../domaincapsdata/qemu_7.0.0-q35.x86_64.xml | 3 +++ .../domaincapsdata/qemu_7.0.0-tcg.x86_64.xml | 3 +++ tests/domaincapsdata/qemu_7.0.0.ppc64.xml | 3 +++ tests/domaincapsdata/qemu_7.0.0.x86_64.xml | 3 +++ .../domaincapsdata/qemu_7.1.0-q35.x86_64.xml | 3 +++ .../domaincapsdata/qemu_7.1.0-tcg.x86_64.xml | 3 +++ tests/domaincapsdata/qemu_7.1.0.ppc64.xml | 3 +++ tests/domaincapsdata/qemu_7.1.0.x86_64.xml | 3 +++ .../qemu_7.2.0-hvf.x86_64+hvf.xml | 3 +++ .../domaincapsdata/qemu_7.2.0-q35.x86_64.xml | 3 +++ .../qemu_7.2.0-tcg.x86_64+hvf.xml | 3 +++ .../domaincapsdata/qemu_7.2.0-tcg.x86_64.xml | 3 +++ tests/domaincapsdata/qemu_7.2.0.ppc.xml | 3 +++ tests/domaincapsdata/qemu_7.2.0.x86_64.xml | 3 +++ .../domaincapsdata/qemu_8.0.0-q35.x86_64.xml | 3 +++ .../domaincapsdata/qemu_8.0.0-tcg.x86_64.xml | 3 +++ tests/domaincapsdata/qemu_8.0.0.x86_64.xml | 3 +++ .../domaincapsdata/qemu_8.1.0-q35.x86_64.xml | 3 +++ .../domaincapsdata/qemu_8.1.0-tcg.x86_64.xml | 3 +++ tests/domaincapsdata/qemu_8.1.0.s390x.xml | 3 +++ tests/domaincapsdata/qemu_8.1.0.x86_64.xml | 3 +++ .../domaincapsdata/qemu_8.2.0-q35.x86_64.xml | 3 +++ .../qemu_8.2.0-tcg-virt.loongarch64.xml | 3 +++ .../domaincapsdata/qemu_8.2.0-tcg.x86_64.xml | 3 +++ .../qemu_8.2.0-virt.aarch64.xml | 3 +++ .../qemu_8.2.0-virt.loongarch64.xml | 3 +++ tests/domaincapsdata/qemu_8.2.0.aarch64.xml | 3 +++ tests/domaincapsdata/qemu_8.2.0.armv7l.xml | 3 +++ tests/domaincapsdata/qemu_8.2.0.s390x.xml | 3 +++ tests/domaincapsdata/qemu_8.2.0.x86_64.xml | 3 +++ .../domaincapsdata/qemu_9.0.0-q35.x86_64.xml | 4 ++++ .../domaincapsdata/qemu_9.0.0-tcg.x86_64.xml | 4 ++++ tests/domaincapsdata/qemu_9.0.0.sparc.xml | 3 +++ tests/domaincapsdata/qemu_9.0.0.x86_64.xml | 4 ++++ .../domaincapsdata/qemu_9.1.0-q35.x86_64.xml | 4 ++++ .../qemu_9.1.0-tcg-virt.riscv64.xml | 3 +++ .../domaincapsdata/qemu_9.1.0-tcg.x86_64.xml | 4 ++++ .../qemu_9.1.0-virt.riscv64.xml | 3 +++ tests/domaincapsdata/qemu_9.1.0.s390x.xml | 4 ++++ tests/domaincapsdata/qemu_9.1.0.x86_64.xml | 4 ++++ .../qemu_9.2.0-hvf.aarch64+hvf.xml | 3 +++ .../qemu_9.2.0-q35.x86_64+amdsev.xml | 4 ++++ .../domaincapsdata/qemu_9.2.0-q35.x86_64.xml | 4 ++++ .../qemu_9.2.0-tcg.x86_64+amdsev.xml | 4 ++++ .../domaincapsdata/qemu_9.2.0-tcg.x86_64.xml | 4 ++++ tests/domaincapsdata/qemu_9.2.0.s390x.xml | 4 ++++ .../qemu_9.2.0.x86_64+amdsev.xml | 4 ++++ tests/domaincapsdata/qemu_9.2.0.x86_64.xml | 4 ++++ tests/domaincapsmock.c | 17 ++++++++++++++- 84 files changed, 321 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 5a1545c727..f35c3e1903 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -45,6 +45,7 @@ #include "qemu_firmware.h" #include "virutil.h" #include "virtpm.h" +#include "viriommufd.h" #include <fcntl.h> #include <sys/stat.h> @@ -6779,6 +6780,7 @@ virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCaps *qemuCaps, hostdev->subsysType.report = true; hostdev->capsType.report = true; hostdev->pciBackend.report = true; + hostdev->iommufd.report = true; /* VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES is for containers only */ VIR_DOMAIN_CAPS_ENUM_SET(hostdev->mode, @@ -6810,11 +6812,20 @@ virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCaps *qemuCaps, virDomainCapsEnumClear(&hostdev->capsType); virDomainCapsEnumClear(&hostdev->pciBackend); - if (supportsPassthroughVFIO && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) { - VIR_DOMAIN_CAPS_ENUM_SET(hostdev->pciBackend, - VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_DEFAULT, - VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO); + + VIR_DOMAIN_CAPS_ENUM_SET(hostdev->iommufd, VIR_TRISTATE_BOOL_NO); + + if (supportsPassthroughVFIO) { + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) { + VIR_DOMAIN_CAPS_ENUM_SET(hostdev->pciBackend, + VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_DEFAULT, + VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO); + } + + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_IOMMUFD) && + virIOMMUFDSupported()) { + VIR_DOMAIN_CAPS_ENUM_SET(hostdev->iommufd, VIR_TRISTATE_BOOL_YES); + } } } diff --git a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev.xml index 8cb51d795c..aeccdf612d 100644 --- a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev.xml +++ b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64+amdsev.xml @@ -856,6 +856,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml index 56192354ac..86a740099b 100644 --- a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml @@ -1755,6 +1755,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64+amdsev.xml index 4242f2fe9c..5d9ce948f8 100644 --- a/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64+amdsev.xml +++ b/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64+amdsev.xml @@ -1840,6 +1840,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml index 76d5fdd0d9..3915ec38cf 100644 --- a/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml @@ -1840,6 +1840,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.0.0-virt.aarch64.xml b/tests/domaincapsdata/qemu_10.0.0-virt.aarch64.xml index 30863d3d6b..058bd84a33 100644 --- a/tests/domaincapsdata/qemu_10.0.0-virt.aarch64.xml +++ b/tests/domaincapsdata/qemu_10.0.0-virt.aarch64.xml @@ -154,6 +154,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.0.0.aarch64.xml b/tests/domaincapsdata/qemu_10.0.0.aarch64.xml index 30863d3d6b..058bd84a33 100644 --- a/tests/domaincapsdata/qemu_10.0.0.aarch64.xml +++ b/tests/domaincapsdata/qemu_10.0.0.aarch64.xml @@ -154,6 +154,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.0.0.ppc64.xml b/tests/domaincapsdata/qemu_10.0.0.ppc64.xml index 5136e7a20d..f3ff165aa1 100644 --- a/tests/domaincapsdata/qemu_10.0.0.ppc64.xml +++ b/tests/domaincapsdata/qemu_10.0.0.ppc64.xml @@ -107,6 +107,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.0.0.s390x.xml b/tests/domaincapsdata/qemu_10.0.0.s390x.xml index 3bbdbd68d0..220afb9d7d 100644 --- a/tests/domaincapsdata/qemu_10.0.0.s390x.xml +++ b/tests/domaincapsdata/qemu_10.0.0.s390x.xml @@ -283,6 +283,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.0.0.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_10.0.0.x86_64+amdsev.xml index 8b02db8802..9dcc7f2e44 100644 --- a/tests/domaincapsdata/qemu_10.0.0.x86_64+amdsev.xml +++ b/tests/domaincapsdata/qemu_10.0.0.x86_64+amdsev.xml @@ -856,6 +856,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.0.0.x86_64.xml b/tests/domaincapsdata/qemu_10.0.0.x86_64.xml index 6dac17808c..c0c3a2e6db 100644 --- a/tests/domaincapsdata/qemu_10.0.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.0.0.x86_64.xml @@ -1755,6 +1755,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx.xml b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx.xml index 31d4fab043..5f6ee44ac7 100644 --- a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx.xml +++ b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64+inteltdx.xml @@ -909,6 +909,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64.xml index 6213908152..fc82987630 100644 --- a/tests/domaincapsdata/qemu_10.1.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.1.0-q35.x86_64.xml @@ -2100,6 +2100,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64+inteltdx.xml b/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64+inteltdx.xml index cace9f109a..e30b20e31e 100644 --- a/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64+inteltdx.xml +++ b/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64+inteltdx.xml @@ -2222,6 +2222,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64.xml index 804848b8a7..34e5812613 100644 --- a/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.1.0-tcg.x86_64.xml @@ -2226,6 +2226,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.1.0.s390x.xml b/tests/domaincapsdata/qemu_10.1.0.s390x.xml index 9d773385c4..373b9f1f59 100644 --- a/tests/domaincapsdata/qemu_10.1.0.s390x.xml +++ b/tests/domaincapsdata/qemu_10.1.0.s390x.xml @@ -351,6 +351,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.1.0.x86_64+inteltdx.xml b/tests/domaincapsdata/qemu_10.1.0.x86_64+inteltdx.xml index 6320200c20..1d5a1b5404 100644 --- a/tests/domaincapsdata/qemu_10.1.0.x86_64+inteltdx.xml +++ b/tests/domaincapsdata/qemu_10.1.0.x86_64+inteltdx.xml @@ -909,6 +909,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.1.0.x86_64.xml b/tests/domaincapsdata/qemu_10.1.0.x86_64.xml index 35c9b8c6d3..3be5e34fe6 100644 --- a/tests/domaincapsdata/qemu_10.1.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.1.0.x86_64.xml @@ -2100,6 +2100,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv.xml b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv.xml index ebba8fd49f..6914726a8b 100644 --- a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv.xml +++ b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64+mshv.xml @@ -110,6 +110,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64.xml index 5ce911d62f..cfa51195ba 100644 --- a/tests/domaincapsdata/qemu_10.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.2.0-q35.x86_64.xml @@ -1206,6 +1206,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64+mshv.xml b/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64+mshv.xml index 6c6f1e84c3..35331dc4d4 100644 --- a/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64+mshv.xml +++ b/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64+mshv.xml @@ -2223,6 +2223,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64.xml index 14e8e30f1c..7fba7f45f3 100644 --- a/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.2.0-tcg.x86_64.xml @@ -2226,6 +2226,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.2.0-virt.aarch64.xml b/tests/domaincapsdata/qemu_10.2.0-virt.aarch64.xml index 84d3022006..1613b28b71 100644 --- a/tests/domaincapsdata/qemu_10.2.0-virt.aarch64.xml +++ b/tests/domaincapsdata/qemu_10.2.0-virt.aarch64.xml @@ -144,6 +144,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.2.0.aarch64.xml b/tests/domaincapsdata/qemu_10.2.0.aarch64.xml index 84d3022006..1613b28b71 100644 --- a/tests/domaincapsdata/qemu_10.2.0.aarch64.xml +++ b/tests/domaincapsdata/qemu_10.2.0.aarch64.xml @@ -144,6 +144,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.2.0.x86_64+mshv.xml b/tests/domaincapsdata/qemu_10.2.0.x86_64+mshv.xml index c8f2585d7d..faf9b15e0d 100644 --- a/tests/domaincapsdata/qemu_10.2.0.x86_64+mshv.xml +++ b/tests/domaincapsdata/qemu_10.2.0.x86_64+mshv.xml @@ -110,6 +110,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_10.2.0.x86_64.xml b/tests/domaincapsdata/qemu_10.2.0.x86_64.xml index 333bbaa698..811951cde5 100644 --- a/tests/domaincapsdata/qemu_10.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.2.0.x86_64.xml @@ -1206,6 +1206,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_11.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_11.0.0-q35.x86_64.xml index be89b0a4f2..1e1b6b723e 100644 --- a/tests/domaincapsdata/qemu_11.0.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_11.0.0-q35.x86_64.xml @@ -1206,6 +1206,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_11.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_11.0.0-tcg.x86_64.xml index bb611142b3..d87c1277d3 100644 --- a/tests/domaincapsdata/qemu_11.0.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_11.0.0-tcg.x86_64.xml @@ -2226,6 +2226,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_11.0.0-virt.aarch64.xml b/tests/domaincapsdata/qemu_11.0.0-virt.aarch64.xml index 906e3c1e68..d0245d0837 100644 --- a/tests/domaincapsdata/qemu_11.0.0-virt.aarch64.xml +++ b/tests/domaincapsdata/qemu_11.0.0-virt.aarch64.xml @@ -144,6 +144,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_11.0.0.aarch64.xml b/tests/domaincapsdata/qemu_11.0.0.aarch64.xml index 906e3c1e68..d0245d0837 100644 --- a/tests/domaincapsdata/qemu_11.0.0.aarch64.xml +++ b/tests/domaincapsdata/qemu_11.0.0.aarch64.xml @@ -144,6 +144,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_11.0.0.x86_64.xml b/tests/domaincapsdata/qemu_11.0.0.x86_64.xml index 956d59f877..58d5093886 100644 --- a/tests/domaincapsdata/qemu_11.0.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_11.0.0.x86_64.xml @@ -1206,6 +1206,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml index b14cbddc59..0b66b77e73 100644 --- a/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml @@ -1060,6 +1060,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml index 51547bf505..ce4b14f28c 100644 --- a/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml @@ -1862,6 +1862,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_6.2.0.ppc64.xml b/tests/domaincapsdata/qemu_6.2.0.ppc64.xml index 411925ad66..fb8361ae97 100644 --- a/tests/domaincapsdata/qemu_6.2.0.ppc64.xml +++ b/tests/domaincapsdata/qemu_6.2.0.ppc64.xml @@ -108,6 +108,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_6.2.0.x86_64.xml b/tests/domaincapsdata/qemu_6.2.0.x86_64.xml index ab387c862e..33b2e4905e 100644 --- a/tests/domaincapsdata/qemu_6.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.2.0.x86_64.xml @@ -1060,6 +1060,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml index 4bbcb516ec..2d7519ae94 100644 --- a/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml @@ -1089,6 +1089,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml index 839f0600c2..01975a5e34 100644 --- a/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml @@ -1888,6 +1888,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.0.0.ppc64.xml b/tests/domaincapsdata/qemu_7.0.0.ppc64.xml index 147d1bf7fb..03bbe16497 100644 --- a/tests/domaincapsdata/qemu_7.0.0.ppc64.xml +++ b/tests/domaincapsdata/qemu_7.0.0.ppc64.xml @@ -110,6 +110,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.0.0.x86_64.xml b/tests/domaincapsdata/qemu_7.0.0.x86_64.xml index 612b5a44cc..8fa3d3e0f4 100644 --- a/tests/domaincapsdata/qemu_7.0.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.0.0.x86_64.xml @@ -1089,6 +1089,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml index a031b673dd..1991133a62 100644 --- a/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml @@ -1056,6 +1056,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml index 9360f8fadf..41bfdbecb6 100644 --- a/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml @@ -1836,6 +1836,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.1.0.ppc64.xml b/tests/domaincapsdata/qemu_7.1.0.ppc64.xml index f3a2dfe6ff..03d6b23a45 100644 --- a/tests/domaincapsdata/qemu_7.1.0.ppc64.xml +++ b/tests/domaincapsdata/qemu_7.1.0.ppc64.xml @@ -103,6 +103,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.1.0.x86_64.xml b/tests/domaincapsdata/qemu_7.1.0.x86_64.xml index 6738d8f852..54e8e9d87a 100644 --- a/tests/domaincapsdata/qemu_7.1.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.1.0.x86_64.xml @@ -1056,6 +1056,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml b/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml index b338bcc470..58ef1bde99 100644 --- a/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml +++ b/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml @@ -1061,6 +1061,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml index 39eb10dc7a..7c325b52aa 100644 --- a/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml @@ -1061,6 +1061,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml index 77fce0eb95..27ecea6fe0 100644 --- a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml +++ b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml @@ -1541,6 +1541,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml index 77fce0eb95..27ecea6fe0 100644 --- a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml @@ -1541,6 +1541,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.2.0.ppc.xml b/tests/domaincapsdata/qemu_7.2.0.ppc.xml index 8bda6af431..7cbde763ef 100644 --- a/tests/domaincapsdata/qemu_7.2.0.ppc.xml +++ b/tests/domaincapsdata/qemu_7.2.0.ppc.xml @@ -102,6 +102,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_7.2.0.x86_64.xml b/tests/domaincapsdata/qemu_7.2.0.x86_64.xml index 16708c3d85..b9a174368a 100644 --- a/tests/domaincapsdata/qemu_7.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.2.0.x86_64.xml @@ -1061,6 +1061,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml index 4acd9b76b2..60893adebf 100644 --- a/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml @@ -1143,6 +1143,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml index c8efc8f183..23e41eb13c 100644 --- a/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml @@ -1636,6 +1636,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.0.0.x86_64.xml b/tests/domaincapsdata/qemu_8.0.0.x86_64.xml index cfa00f3150..daa91d428f 100644 --- a/tests/domaincapsdata/qemu_8.0.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.0.0.x86_64.xml @@ -1143,6 +1143,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml index 83a703da52..df003825ea 100644 --- a/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml @@ -1402,6 +1402,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml index 725002966d..10330281bd 100644 --- a/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml @@ -1658,6 +1658,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.1.0.s390x.xml b/tests/domaincapsdata/qemu_8.1.0.s390x.xml index 0872931dd7..c86f0113f3 100644 --- a/tests/domaincapsdata/qemu_8.1.0.s390x.xml +++ b/tests/domaincapsdata/qemu_8.1.0.s390x.xml @@ -371,6 +371,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.1.0.x86_64.xml b/tests/domaincapsdata/qemu_8.1.0.x86_64.xml index 6a3cb84342..205334e84b 100644 --- a/tests/domaincapsdata/qemu_8.1.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.1.0.x86_64.xml @@ -1402,6 +1402,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml index a25cf01799..bd9dbf8cba 100644 --- a/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml @@ -1403,6 +1403,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml b/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml index eead5ff076..10e514dd45 100644 --- a/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml +++ b/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml @@ -106,6 +106,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml index 3b986eb386..60e5cb8632 100644 --- a/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml @@ -1624,6 +1624,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml b/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml index bb563d6e6c..f67204a14c 100644 --- a/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml +++ b/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml @@ -154,6 +154,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml b/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml index 4d441289a4..6e05a09abb 100644 --- a/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml +++ b/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml @@ -110,6 +110,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.2.0.aarch64.xml b/tests/domaincapsdata/qemu_8.2.0.aarch64.xml index bb563d6e6c..f67204a14c 100644 --- a/tests/domaincapsdata/qemu_8.2.0.aarch64.xml +++ b/tests/domaincapsdata/qemu_8.2.0.aarch64.xml @@ -154,6 +154,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.2.0.armv7l.xml b/tests/domaincapsdata/qemu_8.2.0.armv7l.xml index 5c467d4a14..7a537a1abc 100644 --- a/tests/domaincapsdata/qemu_8.2.0.armv7l.xml +++ b/tests/domaincapsdata/qemu_8.2.0.armv7l.xml @@ -104,6 +104,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.2.0.s390x.xml b/tests/domaincapsdata/qemu_8.2.0.s390x.xml index 5126dd4d00..ad80492e30 100644 --- a/tests/domaincapsdata/qemu_8.2.0.s390x.xml +++ b/tests/domaincapsdata/qemu_8.2.0.s390x.xml @@ -372,6 +372,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_8.2.0.x86_64.xml b/tests/domaincapsdata/qemu_8.2.0.x86_64.xml index 57cd4d63de..c6558915c1 100644 --- a/tests/domaincapsdata/qemu_8.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.2.0.x86_64.xml @@ -1403,6 +1403,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml index c7932014ad..930014727d 100644 --- a/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml @@ -1403,6 +1403,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml index 3593d70166..19adcfe249 100644 --- a/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml @@ -1553,6 +1553,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.0.0.sparc.xml b/tests/domaincapsdata/qemu_9.0.0.sparc.xml index 6b4dd3c3b5..062e55718b 100644 --- a/tests/domaincapsdata/qemu_9.0.0.sparc.xml +++ b/tests/domaincapsdata/qemu_9.0.0.sparc.xml @@ -90,6 +90,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'/> diff --git a/tests/domaincapsdata/qemu_9.0.0.x86_64.xml b/tests/domaincapsdata/qemu_9.0.0.x86_64.xml index 96303a31cd..bc4e7fa1ee 100644 --- a/tests/domaincapsdata/qemu_9.0.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.0.0.x86_64.xml @@ -1403,6 +1403,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml index 518a6811fe..927c1b4fab 100644 --- a/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml @@ -1539,6 +1539,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.1.0-tcg-virt.riscv64.xml b/tests/domaincapsdata/qemu_9.1.0-tcg-virt.riscv64.xml index ce7fe71141..cb519f348c 100644 --- a/tests/domaincapsdata/qemu_9.1.0-tcg-virt.riscv64.xml +++ b/tests/domaincapsdata/qemu_9.1.0-tcg-virt.riscv64.xml @@ -117,6 +117,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml index 70928471b3..a8b1bfed73 100644 --- a/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml @@ -1658,6 +1658,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.1.0-virt.riscv64.xml b/tests/domaincapsdata/qemu_9.1.0-virt.riscv64.xml index fabb09bf72..8e9bd3a15b 100644 --- a/tests/domaincapsdata/qemu_9.1.0-virt.riscv64.xml +++ b/tests/domaincapsdata/qemu_9.1.0-virt.riscv64.xml @@ -106,6 +106,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.1.0.s390x.xml b/tests/domaincapsdata/qemu_9.1.0.s390x.xml index d4649de513..2854713ca3 100644 --- a/tests/domaincapsdata/qemu_9.1.0.s390x.xml +++ b/tests/domaincapsdata/qemu_9.1.0.s390x.xml @@ -235,6 +235,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.1.0.x86_64.xml b/tests/domaincapsdata/qemu_9.1.0.x86_64.xml index ee101364cc..e4d36b95ac 100644 --- a/tests/domaincapsdata/qemu_9.1.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.1.0.x86_64.xml @@ -1539,6 +1539,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.2.0-hvf.aarch64+hvf.xml b/tests/domaincapsdata/qemu_9.2.0-hvf.aarch64+hvf.xml index ae657c7f72..db51e7b120 100644 --- a/tests/domaincapsdata/qemu_9.2.0-hvf.aarch64+hvf.xml +++ b/tests/domaincapsdata/qemu_9.2.0-hvf.aarch64+hvf.xml @@ -151,6 +151,9 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev.xml index 35dc5785bc..39bdb2615b 100644 --- a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev.xml +++ b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64+amdsev.xml @@ -736,6 +736,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml index baaaf4f91c..cc31c01dee 100644 --- a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml @@ -1597,6 +1597,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64+amdsev.xml index 033004a1f4..d01e029394 100644 --- a/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64+amdsev.xml +++ b/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64+amdsev.xml @@ -1705,6 +1705,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml index f20fe882c6..6088c4b905 100644 --- a/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml @@ -1705,6 +1705,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.2.0.s390x.xml b/tests/domaincapsdata/qemu_9.2.0.s390x.xml index 21a1b4f5a9..ef379afe69 100644 --- a/tests/domaincapsdata/qemu_9.2.0.s390x.xml +++ b/tests/domaincapsdata/qemu_9.2.0.s390x.xml @@ -235,6 +235,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.2.0.x86_64+amdsev.xml b/tests/domaincapsdata/qemu_9.2.0.x86_64+amdsev.xml index 39390d2ab6..c0485f8ffa 100644 --- a/tests/domaincapsdata/qemu_9.2.0.x86_64+amdsev.xml +++ b/tests/domaincapsdata/qemu_9.2.0.x86_64+amdsev.xml @@ -736,6 +736,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsdata/qemu_9.2.0.x86_64.xml b/tests/domaincapsdata/qemu_9.2.0.x86_64.xml index c477a1d2c4..dcb78a93c6 100644 --- a/tests/domaincapsdata/qemu_9.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.2.0.x86_64.xml @@ -1597,6 +1597,10 @@ <value>default</value> <value>vfio</value> </enum> + <enum name='iommufd'> + <value>yes</value> + <value>no</value> + </enum> </hostdev> <rng supported='yes'> <enum name='model'> diff --git a/tests/domaincapsmock.c b/tests/domaincapsmock.c index 7bece6c8c1..370ce35709 100644 --- a/tests/domaincapsmock.c +++ b/tests/domaincapsmock.c @@ -16,11 +16,13 @@ #include <config.h> +#include "virfile.h" #include "virhostcpu.h" #include "virhostmem.h" +#include "viriommufd.h" +#include "virmock.h" #if WITH_QEMU -# include "virmock.h" # include "qemu/qemu_capabilities.h" #endif @@ -78,3 +80,16 @@ virHostMemGetTHPSize(unsigned long long *size) *size = 2048; return 0; } + +static bool (*real_virFileExists)(const char *path); + +bool +virFileExists(const char *path) +{ + VIR_MOCK_REAL_INIT(virFileExists); + + if (STREQ(path, VIR_IOMMU_DEV_PATH)) + return true; + + return real_virFileExists(path); +} -- 2.53.0
On 2/16/26 13:27, Pavel Hrdina via Devel wrote:
Fix some FD leaks in the code, code refactor and improvements as preparation for implementing hotplug support.
Add domain capability to report if IOMMUFD is supported.
Pavel Hrdina (24): qemu: Introduce QEMU_CAPS_OBJECT_IOMMUFD qemu: Move IOMMUFD validation to qemu_validate util: Move openning IOMMU device to viriommufd qemu_process: Refactor qemuProcessOpenIommuFd util: Move openning VFIO device to virpci qemu_process: Refactor qemuProcessOpenVfioDeviceFd util: Use virPCIDevice as argument in virPCIDeviceGetVfioPath conf: Introduce virHostdevIsPCIDeviceWithIOMMUFD conf: Introduce virDomainDefHasPCIHostdevWithIOMMUFD qemu_domain: Add missing IOMMUFD cleanup qemu_process: Fix FD leak with multiple host devices using IOMMUFD qemu_process: Refactor qemuProcessOpenVfioFds qemuxmlconftest: Refactor host device preparation qemuxmlconftest: Rename and refactor testSetupHostdevPrivateData qemuxmlconftest: Set fake FD for IOMMUFD qemu: Convert IOMMUFD to qemuFDPassDirect qemu: Convert vfioDeviceFd to qemuFDPassDirect qemu_command: Don't use host property if IOMMUFD is used qemu: Save IOMMUFD state into status XML qemu_hotplug: Remove iommufd object if no longer needed qemu_command: Extract building IOMMUFD props to function qemu_hotplug: Add support to hotplug host device with IOMMUFD conf: Introduce iommufd enum for domaincaps qemu: Fill iommufd domain capability
129 files changed, 694 insertions(+), 199 deletions(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Michal Prívozník -
Pavel Hrdina