mirror of
https://github.com/libvirt/libvirt.git
synced 2026-10-02 12:20:06 -05:00
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:
1 parent
e1b8853e48
commit
1fd9f5a3db
19 files changed
+44
-13
No files matched your search
@@ -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 */
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user