diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c index 4fbd849ebf..1f9077982a 100644 --- a/src/qemu/qemu_postparse.c +++ b/src/qemu/qemu_postparse.c @@ -783,6 +783,15 @@ qemuDomainPstoreDefPostParse(virDomainPstoreDef *pstore, } +static bool +qemuDomainNeedsIOMMUWithEIM(const virDomainDef *def) +{ + return ARCH_IS_X86(def->os.arch) && + virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_EIM && + qemuDomainIsQ35(def); +} + + static int qemuDomainIOMMUDefPostParse(virDomainIOMMUDef *iommu, const virDomainDef *def, @@ -793,9 +802,7 @@ qemuDomainIOMMUDefPostParse(virDomainIOMMUDef *iommu, * (EIM) 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 && - ARCH_IS_X86(def->os.arch) && - virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_EIM && - qemuDomainIsQ35(def) && + qemuDomainNeedsIOMMUWithEIM(def) && iommu && iommu->model == VIR_DOMAIN_IOMMU_MODEL_INTEL) { /* eim requires intremap. */ @@ -1548,9 +1555,13 @@ qemuDomainDefEnableDefaultFeatures(virDomainDef *def, def->features[VIR_DOMAIN_FEATURE_GIC] = VIR_TRISTATE_SWITCH_ON; } - /* IOMMU with intremap requires split I/O APIC */ + /* IOMMU with intremap requires split I/O APIC. But it may happen that + * domain already has IOMMU without inremap. This will be fixed in + * qemuDomainIOMMUDefPostParse() but there domain definition can't be + * modified so change it now. */ if (def->iommu && - def->iommu->intremap == VIR_TRISTATE_SWITCH_ON && + (def->iommu->intremap == VIR_TRISTATE_SWITCH_ON || + qemuDomainNeedsIOMMUWithEIM(def)) && def->features[VIR_DOMAIN_FEATURE_IOAPIC] == VIR_DOMAIN_IOAPIC_NONE) { def->features[VIR_DOMAIN_FEATURE_IOAPIC] = VIR_DOMAIN_IOAPIC_QEMU; } diff --git a/tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.x86_64-latest.abi-update.args b/tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.x86_64-latest.abi-update.args new file mode 120000 index 0000000000..a7fdee3d71 --- /dev/null +++ b/tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.x86_64-latest.abi-update.args @@ -0,0 +1 @@ +intel-iommu-eim-autoadd.x86_64-latest.abi-update.args \ No newline at end of file diff --git a/tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.x86_64-latest.abi-update.xml b/tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.x86_64-latest.abi-update.xml new file mode 120000 index 0000000000..928ea1b4c8 --- /dev/null +++ b/tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.x86_64-latest.abi-update.xml @@ -0,0 +1 @@ +intel-iommu-eim-autoadd.x86_64-latest.abi-update.xml \ No newline at end of file diff --git a/tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.xml b/tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.xml new file mode 100644 index 0000000000..b39ee55786 --- /dev/null +++ b/tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.xml @@ -0,0 +1,32 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 288 + + hvm + + + + qemu64 + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + + + +
+ + + + +