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 <[email protected]>
Reviewed-by: Ankit Soni <[email protected]>
Tested-by: Ankit Soni <[email protected]>
---
 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

Reply via email to