Rename QEMU_MAX_VCPUS_WITHOUT_EIM to QEMU_MAX_VCPUS_WITHOUT_X2APIC to
clarify the limit is tied to APIC ID width.
Validation now accepts either:
- intel-iommu with eim='on', or
- amd-iommu with xtsup='on'
for guests with more than 255 vCPUs on x86/q35.
Update error messages to mention x2APIC mode instead of extended
interrupt mode. This reflects that AMD platforms can satisfy the same
requirement via xtsup property on amd-iommu.
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>
---
src/qemu/qemu_postparse.c | 4 ++--
src/qemu/qemu_validate.c | 11 ++++++-----
src/qemu/qemu_validate.h | 2 +-
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c
index 8940cb09b3..58bd70c741 100644
--- a/src/qemu/qemu_postparse.c
+++ b/src/qemu/qemu_postparse.c
@@ -797,7 +797,7 @@ static bool
qemuDomainNeedsIOMMUWithEIM(const virDomainDef *def)
{
return ARCH_IS_X86(def->os.arch) &&
- virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_EIM &&
+ virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_X2APIC &&
qemuDomainIsQ35(def);
}
@@ -1204,7 +1204,7 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver,
addImplicitSATA = true;
addITCOWatchdog = true;
- if (virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_EIM) {
+ if (virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_X2APIC) {
addIOMMU = true;
}
}
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 0eb5d5ea3b..fb7b2a4882 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -920,17 +920,18 @@ qemuValidateDomainVCpuTopology(const virDomainDef *def, virQEMUCaps *qemuCaps)
}
if (ARCH_IS_X86(def->os.arch) &&
- virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_EIM) {
+ virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_X2APIC) {
if (!qemuDomainIsQ35(def)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("more than %1$d vCPUs are only supported on q35-based machine types"),
- QEMU_MAX_VCPUS_WITHOUT_EIM);
+ QEMU_MAX_VCPUS_WITHOUT_X2APIC);
return -1;
}
- if (!def->iommus || def->iommus[0]->eim != VIR_TRISTATE_SWITCH_ON) {
+ if (!def->iommus || (def->iommus[0]->eim != VIR_TRISTATE_SWITCH_ON &&
+ def->iommus[0]->xtsup != VIR_TRISTATE_SWITCH_ON)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("more than %1$d vCPUs require extended interrupt mode enabled on the iommu device"),
- QEMU_MAX_VCPUS_WITHOUT_EIM);
+ _("more than %1$d vCPUs require EIM or XTSup mode enabled on the iommu device"),
+ QEMU_MAX_VCPUS_WITHOUT_X2APIC);
return -1;
}
}
diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h
index 9315be73f5..27dc120c3a 100644
--- a/src/qemu/qemu_validate.h
+++ b/src/qemu/qemu_validate.h
@@ -22,7 +22,7 @@
#include "qemu_capabilities.h"
-#define QEMU_MAX_VCPUS_WITHOUT_EIM 255
+#define QEMU_MAX_VCPUS_WITHOUT_X2APIC 255
int
qemuValidateDomainDef(const virDomainDef *def,
--
2.34.1