- kvm-arm-kvm-report-registers-we-failed-to-set.patch [RHEL-119368] - kvm-pcie_sriov-make-pcie_sriov_pf_exit-safe-on-non-SR-IO.patch [RHEL-116443] - kvm-target-i386-add-compatibility-property-for-arch_capa.patch [RHEL-120253] - kvm-target-i386-add-compatibility-property-for-pdcm-feat.patch [RHEL-120253] - Resolves: RHEL-119368 ([rhel10] Backport "arm/kvm: report registers we failed to set") - Resolves: RHEL-116443 (qemu crash after hot-unplug disk from the multifunction enabled bus,crash point PCIDevice *vf = dev->exp.sriov_pf.vf[i]) - Resolves: RHEL-120253 (Backport fixes for PDCM and ARCH_CAPABILITIES migration incompatibility)
116 lines
4.3 KiB
Diff
116 lines
4.3 KiB
Diff
From 0d2ec98960c89003d3040818b5c5493cd636b98d Mon Sep 17 00:00:00 2001
|
|
From: Hector Cao <hector.cao@canonical.com>
|
|
Date: Tue, 23 Sep 2025 12:16:41 +0200
|
|
Subject: [PATCH 4/4] target/i386: add compatibility property for pdcm feature
|
|
|
|
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
|
RH-MergeRequest: 411: fix x86-64 migration regression in QEMU 10.1
|
|
RH-Jira: RHEL-120253
|
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
RH-Commit: [2/2] 9d76b45215d7ae2bc5ea2e61fe01780059d6d44c (bonzini/qemu-kvm-centos)
|
|
|
|
JIRA: https://issues.redhat.com/browse/RHEL-120253
|
|
|
|
The pdcm feature is supposed to be disabled when PMU is not
|
|
available. Up until v10.1, pdcm feature is enabled even when PMU
|
|
is off. This behavior has been fixed but this change breaks the
|
|
migration of VMs that are run with QEMU < 10.0 and expect the pdcm
|
|
feature to be enabled on the destination host.
|
|
|
|
This commit restores the legacy behavior for machines with version
|
|
prior to 10.1 to allow the migration from older QEMU to QEMU 10.1.
|
|
|
|
Signed-off-by: Hector Cao <hector.cao@canonical.com>
|
|
Link: https://lore.kernel.org/r/20250910115733.21149-3-hector.cao@canonical.com
|
|
Fixes: e68ec298090 ("i386/cpu: Move adjustment of CPUID_EXT_PDCM before feature_dependencies[] check", 2025-06-20)
|
|
[Move property from migration object to CPU. - Paolo]
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
(cherry picked from commit 6529f31e0dccadb532c80b36e3efe7aef83f9cad)
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
---
|
|
hw/i386/pc.c | 2 ++
|
|
target/i386/cpu.c | 15 ++++++++++++---
|
|
target/i386/cpu.h | 6 ++++++
|
|
3 files changed, 20 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
|
index 625a89d097..446d4a7c93 100644
|
|
--- a/hw/i386/pc.c
|
|
+++ b/hw/i386/pc.c
|
|
@@ -85,6 +85,7 @@ GlobalProperty pc_compat_10_0[] = {
|
|
{ TYPE_X86_CPU, "x-consistent-cache", "false" },
|
|
{ TYPE_X86_CPU, "x-vendor-cpuid-only-v2", "false" },
|
|
{ TYPE_X86_CPU, "x-arch-cap-always-on", "true" },
|
|
+ { TYPE_X86_CPU, "x-pdcm-on-even-without-pmu", "true" },
|
|
};
|
|
const size_t pc_compat_10_0_len = G_N_ELEMENTS(pc_compat_10_0);
|
|
|
|
@@ -301,6 +302,7 @@ GlobalProperty pc_rhel_10_2_compat[] = {
|
|
{ TYPE_X86_CPU, "x-consistent-cache", "false" },
|
|
{ TYPE_X86_CPU, "x-vendor-cpuid-only-v2", "false" },
|
|
{ TYPE_X86_CPU, "x-arch-cap-always-on", "true" },
|
|
+ { TYPE_X86_CPU, "x-pdcm-on-even-without-pmu", "true" },
|
|
};
|
|
const size_t pc_rhel_10_2_compat_len = G_N_ELEMENTS(pc_compat_10_0);
|
|
|
|
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
|
index de288dc5ac..dfcdfd3da6 100644
|
|
--- a/target/i386/cpu.c
|
|
+++ b/target/i386/cpu.c
|
|
@@ -7928,6 +7928,11 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
|
/* Fixup overflow: max value for bits 23-16 is 255. */
|
|
*ebx |= MIN(num, 255) << 16;
|
|
}
|
|
+ if (cpu->pdcm_on_even_without_pmu) {
|
|
+ if (!cpu->enable_pmu) {
|
|
+ *ecx &= ~CPUID_EXT_PDCM;
|
|
+ }
|
|
+ }
|
|
break;
|
|
case 2: { /* cache info: needed for Pentium Pro compatibility */
|
|
const CPUCaches *caches;
|
|
@@ -8978,9 +8983,11 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
|
}
|
|
}
|
|
|
|
- /* PDCM is fixed1 bit for TDX */
|
|
- if (!cpu->enable_pmu && !is_tdx_vm()) {
|
|
- env->features[FEAT_1_ECX] &= ~CPUID_EXT_PDCM;
|
|
+ if (!cpu->pdcm_on_even_without_pmu) {
|
|
+ /* PDCM is fixed1 bit for TDX */
|
|
+ if (!cpu->enable_pmu && !is_tdx_vm()) {
|
|
+ env->features[FEAT_1_ECX] &= ~CPUID_EXT_PDCM;
|
|
+ }
|
|
}
|
|
|
|
for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
|
|
@@ -10041,6 +10048,8 @@ static const Property x86_cpu_properties[] = {
|
|
|
|
DEFINE_PROP_BOOL("x-arch-cap-always-on", X86CPU,
|
|
arch_cap_always_on, false),
|
|
+ DEFINE_PROP_BOOL("x-pdcm-on-even-without-pmu", X86CPU,
|
|
+ pdcm_on_even_without_pmu, false),
|
|
};
|
|
|
|
#ifndef CONFIG_USER_ONLY
|
|
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
|
index b966bc997c..2187e61654 100644
|
|
--- a/target/i386/cpu.h
|
|
+++ b/target/i386/cpu.h
|
|
@@ -2320,6 +2320,12 @@ struct ArchCPU {
|
|
*/
|
|
bool arch_cap_always_on;
|
|
|
|
+ /*
|
|
+ * Backwards compatibility with QEMU <10.1. The PDCM feature is now disabled when
|
|
+ * PMU is not available, but prior to 10.1 it was enabled even if PMU is off.
|
|
+ */
|
|
+ bool pdcm_on_even_without_pmu;
|
|
+
|
|
/* Number of physical address bits supported */
|
|
uint32_t phys_bits;
|
|
|
|
--
|
|
2.47.3
|
|
|