qemu: Enable AMD IOMMU XTSUP by default

Add QEMU_CAPS_AMD_IOMMU_XTSUP capability and enable xtsup
by default for AMD IOMMU when a Q35 domain has >255 vCPUs,
similar to Intel EIM auto-enable logic. Also ensure intremap is
turned on when required.

Signed-off-by: Xiaotian Feng <xiaotian.feng@amd.com>
Reviewed-by: Ankit Soni <Ankit.Soni@amd.com>
Tested-by: Ankit Soni <Ankit.Soni@amd.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Xiaotian Feng authored and Michal Privoznik committed 2026-03-13 15:24:24 +01:00
1 parent e1b8853e48
commit 1fd9f5a3db
19 files changed
+44 -13

No files matched your search

+2
View File
@@ -763,6 +763,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
"iommufd", /* QEMU_CAPS_OBJECT_IOMMUFD */
"uefi-vars", /* QEMU_CAPS_DEVICE_UEFI_VARS */
"query-block-flat", /* QEMU_CAPS_QUERY_BLOCK_FLAT */
"amd-iommu.xtsup", /* QEMU_CAPS_AMD_IOMMU_XTSUP */
);
@@ -1633,6 +1634,7 @@ static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsVirtioBlkCCW[] =
static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsAMDIOMMU[] = {
{ "pci-id", QEMU_CAPS_AMD_IOMMU_PCI_ID, NULL },
{ "xtsup", QEMU_CAPS_AMD_IOMMU_XTSUP, NULL },
};
/* see documentation for virQEMUQAPISchemaPathGet for the query format */
+1
View File
@@ -737,6 +737,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
QEMU_CAPS_OBJECT_IOMMUFD, /* -object iommufd */
QEMU_CAPS_DEVICE_UEFI_VARS, /* -device uefi-vars-{x64,sysbus} */
QEMU_CAPS_QUERY_BLOCK_FLAT, /* 'query-block' command supports 'flat' */
QEMU_CAPS_AMD_IOMMU_XTSUP, /* amd-iommu.xtsup */
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
+25 -13
View File
@@ -794,7 +794,7 @@ qemuDomainPstoreDefPostParse(virDomainPstoreDef *pstore,
static bool
qemuDomainNeedsIOMMUWithEIM(const virDomainDef *def)
qemuDomainNeedsIOMMUWithx2APIC(const virDomainDef *def)
{
return ARCH_IS_X86(def->os.arch) &&
virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_X2APIC &&
@@ -808,22 +808,34 @@ qemuDomainIOMMUDefPostParse(virDomainIOMMUDef *iommu,
virQEMUCaps *qemuCaps,
unsigned int parseFlags)
{
/* In case domain has huge number of vCPUS and Extended Interrupt Mode
* (EIM) is not explicitly turned off, let's enable it. If we didn't then
/* In case domain has huge number of vCPUS and x2APIC (intel EIM or AMD
* XTSUP) is not explicitly turned off, let's enable it. If we didn't then
* guest will have troubles with interrupts. */
if (parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE &&
qemuDomainNeedsIOMMUWithEIM(def) &&
iommu && iommu->model == VIR_DOMAIN_IOMMU_MODEL_INTEL) {
qemuDomainNeedsIOMMUWithx2APIC(def) && iommu) {
if (iommu->model == VIR_DOMAIN_IOMMU_MODEL_INTEL) {
/* eim requires intremap. */
if (iommu->intremap == VIR_TRISTATE_SWITCH_ABSENT &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_INTREMAP)) {
iommu->intremap = VIR_TRISTATE_SWITCH_ON;
}
/* eim requires intremap. */
if (iommu->intremap == VIR_TRISTATE_SWITCH_ABSENT &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_INTREMAP)) {
iommu->intremap = VIR_TRISTATE_SWITCH_ON;
if (iommu->eim == VIR_TRISTATE_SWITCH_ABSENT &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_EIM)) {
iommu->eim = VIR_TRISTATE_SWITCH_ON;
}
}
if (iommu->eim == VIR_TRISTATE_SWITCH_ABSENT &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_EIM)) {
iommu->eim = VIR_TRISTATE_SWITCH_ON;
if (iommu->model == VIR_DOMAIN_IOMMU_MODEL_AMD) {
if (iommu->intremap == VIR_TRISTATE_SWITCH_ABSENT &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_INTREMAP)) {
iommu->intremap = VIR_TRISTATE_SWITCH_ON;
}
if (iommu->xtsup == VIR_TRISTATE_SWITCH_ABSENT &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_AMD_IOMMU_XTSUP)) {
iommu->xtsup = VIR_TRISTATE_SWITCH_ON;
}
}
}
@@ -1544,7 +1556,7 @@ qemuDomainDefEnableDefaultFeatures(virDomainDef *def,
* modified so change it now. */
if (def->iommus && def->iommus[0]->pci_bus < 0 &&
(def->iommus[0]->intremap == VIR_TRISTATE_SWITCH_ON ||
qemuDomainNeedsIOMMUWithEIM(def)) &&
qemuDomainNeedsIOMMUWithx2APIC(def)) &&
def->features[VIR_DOMAIN_FEATURE_IOAPIC] == VIR_DOMAIN_IOAPIC_NONE) {
def->features[VIR_DOMAIN_FEATURE_IOAPIC] = VIR_DOMAIN_IOAPIC_QEMU;
}
@@ -212,6 +212,7 @@
<flag name='virtio-iommu.aw-bits'/>
<flag name='iommufd'/>
<flag name='uefi-vars'/>
<flag name='amd-iommu.xtsup'/>
<version>10000000</version>
<microcodeVersion>43100285</microcodeVersion>
<package>v10.0.0</package>
@@ -212,6 +212,7 @@
<flag name='virtio-iommu.aw-bits'/>
<flag name='iommufd'/>
<flag name='uefi-vars'/>
<flag name='amd-iommu.xtsup'/>
<version>10000000</version>
<microcodeVersion>43100285</microcodeVersion>
<package>v10.0.0</package>
@@ -195,6 +195,7 @@
<flag name='virtio-iommu.aw-bits'/>
<flag name='iommufd'/>
<flag name='uefi-vars'/>
<flag name='amd-iommu.xtsup'/>
<version>10001000</version>
<microcodeVersion>43100286</microcodeVersion>
<package>v10.1.0</package>
@@ -217,6 +217,7 @@
<flag name='virtio-iommu.aw-bits'/>
<flag name='iommufd'/>
<flag name='uefi-vars'/>
<flag name='amd-iommu.xtsup'/>
<version>10001000</version>
<microcodeVersion>43100286</microcodeVersion>
<package>v10.1.0</package>
@@ -205,6 +205,7 @@
<flag name='virtio-iommu.aw-bits'/>
<flag name='iommufd'/>
<flag name='uefi-vars'/>
<flag name='amd-iommu.xtsup'/>
<version>10002000</version>
<microcodeVersion>43100287</microcodeVersion>
<package>v10.2.0</package>
@@ -218,6 +218,7 @@
<flag name='virtio-iommu.aw-bits'/>
<flag name='iommufd'/>
<flag name='uefi-vars'/>
<flag name='amd-iommu.xtsup'/>
<version>10002000</version>
<microcodeVersion>43100287</microcodeVersion>
<package>v10.2.0</package>
@@ -220,6 +220,7 @@
<flag name='iommufd'/>
<flag name='uefi-vars'/>
<flag name='query-block-flat'/>
<flag name='amd-iommu.xtsup'/>
<version>10002050</version>
<microcodeVersion>43100286</microcodeVersion>
<package>v10.2.0-2062-g084a6c6e73</package>
@@ -175,6 +175,7 @@
<flag name='nvme-ns'/>
<flag name='amd-iommu'/>
<flag name='usb-bot'/>
<flag name='amd-iommu.xtsup'/>
<version>6002000</version>
<microcodeVersion>43100244</microcodeVersion>
<package>v6.2.0</package>
@@ -188,6 +188,7 @@
<flag name='nvme-ns'/>
<flag name='amd-iommu'/>
<flag name='usb-bot'/>
<flag name='amd-iommu.xtsup'/>
<version>7001000</version>
<microcodeVersion>43100244</microcodeVersion>
<package>v7.1.0</package>
@@ -192,6 +192,7 @@
<flag name='nvme-ns'/>
<flag name='amd-iommu'/>
<flag name='usb-bot'/>
<flag name='amd-iommu.xtsup'/>
<version>7002000</version>
<microcodeVersion>43100245</microcodeVersion>
<package>v7.2.0</package>
@@ -192,6 +192,7 @@
<flag name='nvme-ns'/>
<flag name='amd-iommu'/>
<flag name='usb-bot'/>
<flag name='amd-iommu.xtsup'/>
<version>7002000</version>
<microcodeVersion>43100245</microcodeVersion>
<package>v7.2.0</package>
@@ -198,6 +198,7 @@
<flag name='nvme-ns'/>
<flag name='amd-iommu'/>
<flag name='usb-bot'/>
<flag name='amd-iommu.xtsup'/>
<version>8001000</version>
<microcodeVersion>43100245</microcodeVersion>
<package>v8.1.0</package>
@@ -201,6 +201,7 @@
<flag name='nvme-ns'/>
<flag name='amd-iommu'/>
<flag name='usb-bot'/>
<flag name='amd-iommu.xtsup'/>
<version>8002000</version>
<microcodeVersion>43100246</microcodeVersion>
<package>v8.2.0</package>
@@ -205,6 +205,7 @@
<flag name='acpi-generic-initiator'/>
<flag name='virtio-iommu.aw-bits'/>
<flag name='iommufd'/>
<flag name='amd-iommu.xtsup'/>
<version>9001000</version>
<microcodeVersion>43100246</microcodeVersion>
<package>v9.1.0</package>
@@ -209,6 +209,7 @@
<flag name='acpi-generic-initiator'/>
<flag name='virtio-iommu.aw-bits'/>
<flag name='iommufd'/>
<flag name='amd-iommu.xtsup'/>
<version>9002000</version>
<microcodeVersion>43100247</microcodeVersion>
<package>v9.2.0</package>
@@ -207,6 +207,7 @@
<flag name='acpi-generic-initiator'/>
<flag name='virtio-iommu.aw-bits'/>
<flag name='iommufd'/>
<flag name='amd-iommu.xtsup'/>
<version>9002000</version>
<microcodeVersion>43100247</microcodeVersion>
<package>v9.2.0</package>