]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: support >255 vcpu w/ amd-iommu xtsup
authorXiaotian Feng <Xiaotian.Feng@amd.com>
Wed, 25 Feb 2026 07:48:20 +0000 (07:48 +0000)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 13 Mar 2026 14:24:24 +0000 (15:24 +0100)
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>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_postparse.c
src/qemu/qemu_validate.c
src/qemu/qemu_validate.h

index 8940cb09b34fda98873e1f2d084f72eefe1d6654..58bd70c741b784c78de6e45cbd1ca8030c3f0ca2 100644 (file)
@@ -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;
             }
         }
index bb3b2fee7eaa132471bdc136e43cd3fa48847656..f8a15374c9e7e8d75a204867fb3d522e9e3161b3 100644 (file)
@@ -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;
         }
     }
index 9315be73f59f54915645e0ae9e71a638061455f3..27dc120c3a1f7fba271c6b4f31f60e0efe6b4733 100644 (file)
@@ -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,