From d561183cc1dd2e4cd6625bc01a5c8ac9a74ecf26 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Apr 20 2023 11:00:14 +0000 Subject: KVM: arm64: PMU: Restore the guest's EL0 event counting after migration (bsc#1012628). --- diff --git a/patches.kernel.org/6.2.12-025-KVM-arm64-PMU-Restore-the-guest-s-EL0-event-co.patch b/patches.kernel.org/6.2.12-025-KVM-arm64-PMU-Restore-the-guest-s-EL0-event-co.patch new file mode 100644 index 0000000..4dcabc8 --- /dev/null +++ b/patches.kernel.org/6.2.12-025-KVM-arm64-PMU-Restore-the-guest-s-EL0-event-co.patch @@ -0,0 +1,66 @@ +From: Reiji Watanabe +Date: Tue, 28 Mar 2023 19:39:44 -0700 +Subject: [PATCH] KVM: arm64: PMU: Restore the guest's EL0 event counting after + migration +References: bsc#1012628 +Patch-mainline: 6.2.12 +Git-commit: f9ea835e99bc8d049bf2a3ec8fa5a7cb4fcade23 + +commit f9ea835e99bc8d049bf2a3ec8fa5a7cb4fcade23 upstream. + +Currently, with VHE, KVM enables the EL0 event counting for the +guest on vcpu_load() or KVM enables it as a part of the PMU +register emulation process, when needed. However, in the migration +case (with VHE), the same handling is lacking, as vPMU register +values that were restored by userspace haven't been propagated yet +(the PMU events haven't been created) at the vcpu load-time on the +first KVM_RUN (kvm_vcpu_pmu_restore_guest() called from vcpu_load() +on the first KVM_RUN won't do anything as events_{guest,host} of +kvm_pmu_events are still zero). + +So, with VHE, enable the guest's EL0 event counting on the first +KVM_RUN (after the migration) when needed. More specifically, +have kvm_pmu_handle_pmcr() call kvm_vcpu_pmu_restore_guest() +so that kvm_pmu_handle_pmcr() on the first KVM_RUN can take +care of it. + +Fixes: d0c94c49792c ("KVM: arm64: Restore PMU configuration on first run") +Cc: stable@vger.kernel.org +Reviewed-by: Marc Zyngier +Signed-off-by: Reiji Watanabe +Link: https://lore.kernel.org/r/20230329023944.2488484-1-reijiw@google.com +Signed-off-by: Oliver Upton +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Jiri Slaby +--- + arch/arm64/kvm/pmu-emul.c | 1 + + arch/arm64/kvm/sys_regs.c | 1 - + 2 files changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/kvm/pmu-emul.c b/arch/arm64/kvm/pmu-emul.c +index c243b10f..5eca0cdd 100644 +--- a/arch/arm64/kvm/pmu-emul.c ++++ b/arch/arm64/kvm/pmu-emul.c +@@ -558,6 +558,7 @@ void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val) + for_each_set_bit(i, &mask, 32) + kvm_pmu_set_pmc_value(kvm_vcpu_idx_to_pmc(vcpu, i), 0, true); + } ++ kvm_vcpu_pmu_restore_guest(vcpu); + } + + static bool kvm_pmu_counter_is_enabled(struct kvm_pmc *pmc) +diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c +index c48c053d..de966c87 100644 +--- a/arch/arm64/kvm/sys_regs.c ++++ b/arch/arm64/kvm/sys_regs.c +@@ -703,7 +703,6 @@ static bool access_pmcr(struct kvm_vcpu *vcpu, struct sys_reg_params *p, + if (!kvm_supports_32bit_el0()) + val |= ARMV8_PMU_PMCR_LC; + kvm_pmu_handle_pmcr(vcpu, val); +- kvm_vcpu_pmu_restore_guest(vcpu); + } else { + /* PMCR.P & PMCR.C are RAZ */ + val = __vcpu_sys_reg(vcpu, PMCR_EL0) +-- +2.35.3 + diff --git a/series.conf b/series.conf index 9f53de7..dcabfc4 100644 --- a/series.conf +++ b/series.conf @@ -2252,6 +2252,7 @@ patches.kernel.org/6.2.12-022-mtd-rawnand-meson-fix-bitmask-for-length-in-co.patch patches.kernel.org/6.2.12-023-mtd-rawnand-stm32_fmc2-remove-unsupported-EDO-.patch patches.kernel.org/6.2.12-024-mtd-rawnand-stm32_fmc2-use-timings.mode-instea.patch + patches.kernel.org/6.2.12-025-KVM-arm64-PMU-Restore-the-guest-s-EL0-event-co.patch ######################################################## # Build fixes that apply to the vanilla kernel too.