35addd78b3
- qemu: Enable I/O APIC even more frequently (RHEL-71414) - cpu_map: Add avx10* CPU features (RHEL-71897) - cpu_map: Add GraniteRapids-v2 CPU model (RHEL-71897) - cpu_map: Add sha512, sm3, and sm4 CPU features (RHEL-71898) Resolves: RHEL-71414, RHEL-71897, RHEL-71898
155 lines
6.7 KiB
Diff
155 lines
6.7 KiB
Diff
From 349536b9f6f1df1f652cee5e25b3d2eae42e8170 Mon Sep 17 00:00:00 2001
|
|
Message-ID: <349536b9f6f1df1f652cee5e25b3d2eae42e8170.1734696366.git.jdenemar@redhat.com>
|
|
From: Michal Privoznik <mprivozn@redhat.com>
|
|
Date: Wed, 18 Dec 2024 11:07:26 +0100
|
|
Subject: [PATCH] qemu: Enable I/O APIC even more frequently
|
|
|
|
In my previous commit v10.10.0-48-g2d222ecf6e I've made us enable
|
|
I/O APIC when there is an IOMMU with EIM. This works well. What
|
|
does not work is case when there's just an IOMMU without EIM but
|
|
with 256+ vCPUS. Problem is that post parsing happens in two
|
|
stages: general domain post parse (where
|
|
qemuDomainDefEnableDefaultFeatures() is called) and then per
|
|
device post parse (where qemuDomainIOMMUDefPostParse() is
|
|
called). Now, in aforementioned case it is the device post parse
|
|
phase where EIM is enabled but the code that would enable
|
|
VIR_DOMAIN_FEATURE_IOAPIC has already run.
|
|
|
|
To resolve this, make the domain post parse callback "foresee"
|
|
the future enabling of EIM so that it can turn on I/O APIC
|
|
beforehand.
|
|
|
|
Resolves: https://issues.redhat.com/browse/RHEL-65844
|
|
Fixes: 2d222ecf6e73614a400b830ac56e9aaa1bc55ecc
|
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
|
(cherry picked from commit 0162f2008e36df489f6f04e4d6002543acfa171d)
|
|
https://issues.redhat.com/browse/RHEL-71414
|
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
|
---
|
|
src/qemu/qemu_postparse.c | 21 +++++++++---
|
|
...m-autoadd-v2.x86_64-latest.abi-update.args | 1 +
|
|
...im-autoadd-v2.x86_64-latest.abi-update.xml | 1 +
|
|
.../intel-iommu-eim-autoadd-v2.xml | 32 +++++++++++++++++++
|
|
tests/qemuxmlconftest.c | 1 +
|
|
5 files changed, 51 insertions(+), 5 deletions(-)
|
|
create mode 120000 tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.x86_64-latest.abi-update.args
|
|
create mode 120000 tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.x86_64-latest.abi-update.xml
|
|
create mode 100644 tests/qemuxmlconfdata/intel-iommu-eim-autoadd-v2.xml
|
|
|
|
diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c
|
|
index f48f172c37..049a6ef2dc 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 @@
|
|
+<domain type='kvm'>
|
|
+ <name>QEMUGuest1</name>
|
|
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
|
+ <memory unit='KiB'>219100</memory>
|
|
+ <currentMemory unit='KiB'>219100</currentMemory>
|
|
+ <vcpu placement='static'>288</vcpu>
|
|
+ <os>
|
|
+ <type arch='x86_64' machine='q35'>hvm</type>
|
|
+ <boot dev='hd'/>
|
|
+ </os>
|
|
+ <cpu mode='custom' match='exact' check='none'>
|
|
+ <model fallback='forbid'>qemu64</model>
|
|
+ </cpu>
|
|
+ <clock offset='utc'/>
|
|
+ <on_poweroff>destroy</on_poweroff>
|
|
+ <on_reboot>restart</on_reboot>
|
|
+ <on_crash>destroy</on_crash>
|
|
+ <devices>
|
|
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
|
|
+ <controller type='pci' index='0' model='pcie-root'/>
|
|
+ <controller type='usb' index='0' model='none'/>
|
|
+ <controller type='sata' index='0'>
|
|
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
|
|
+ </controller>
|
|
+ <input type='mouse' bus='ps2'/>
|
|
+ <input type='keyboard' bus='ps2'/>
|
|
+ <iommu model="intel"/>
|
|
+ <audio id='1' type='none'/>
|
|
+ <watchdog model='itco' action='reset'/>
|
|
+ <memballoon model='none'/>
|
|
+ </devices>
|
|
+</domain>
|
|
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
|
|
index f3c8d0ae34..53a0237a42 100644
|
|
--- a/tests/qemuxmlconftest.c
|
|
+++ b/tests/qemuxmlconftest.c
|
|
@@ -2771,6 +2771,7 @@ mymain(void)
|
|
DO_TEST_CAPS_LATEST("intel-iommu-dma-translation");
|
|
DO_TEST_CAPS_LATEST_PARSE_ERROR("intel-iommu-wrong-machine");
|
|
DO_TEST_CAPS_LATEST_ABI_UPDATE("intel-iommu-eim-autoadd");
|
|
+ DO_TEST_CAPS_LATEST_ABI_UPDATE("intel-iommu-eim-autoadd-v2");
|
|
DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3", "aarch64");
|
|
DO_TEST_CAPS_LATEST("virtio-iommu-x86_64");
|
|
DO_TEST_CAPS_VER_PARSE_ERROR("virtio-iommu-x86_64", "6.1.0");
|
|
--
|
|
2.47.1
|