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