Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: arm64: PMU: Restore the guest's EL0 event counting after migration

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 <maz@kernel.org>
Signed-off-by: Reiji Watanabe <reijiw@google.com>
Link: https://lore.kernel.org/r/20230329023944.2488484-1-reijiw@google.com
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>

authored by

Reiji Watanabe and committed by
Oliver Upton
f9ea835e 8c2e8ac8

+1 -1
+1
arch/arm64/kvm/pmu-emul.c
··· 558 558 for_each_set_bit(i, &mask, 32) 559 559 kvm_pmu_set_pmc_value(kvm_vcpu_idx_to_pmc(vcpu, i), 0, true); 560 560 } 561 + kvm_vcpu_pmu_restore_guest(vcpu); 561 562 } 562 563 563 564 static bool kvm_pmu_counter_is_enabled(struct kvm_pmc *pmc)
-1
arch/arm64/kvm/sys_regs.c
··· 794 794 if (!kvm_supports_32bit_el0()) 795 795 val |= ARMV8_PMU_PMCR_LC; 796 796 kvm_pmu_handle_pmcr(vcpu, val); 797 - kvm_vcpu_pmu_restore_guest(vcpu); 798 797 } else { 799 798 /* PMCR.P & PMCR.C are RAZ */ 800 799 val = __vcpu_sys_reg(vcpu, PMCR_EL0)