[PATCH 0/4] KVM: arm64: PMU: Fix PMUVer handling on heterogeneous PMU systems
Reiji Watanabe
reijiw at google.com
Fri May 26 21:02:32 PDT 2023
This series fixes issues with PMUVer handling for a guest with
PMU configured on heterogeneous PMU systems.
Specifically, it addresses the following two issues.
[A] The default value of ID_AA64DFR0_EL1.PMUVer of the vCPU is set
to its sanitized value. This could be inappropriate on
heterogeneous PMU systems, as arm64_ftr_bits for PMUVer is defined
as FTR_EXACT with safe_val == 0 (when ID_AA64DFR0_EL1.PMUVer of all
PEs on the host is not uniform, the sanitized value will be 0).
[B] KVM uses PMUVer of the PMU hardware that is associated to
the guest (kvm->arch.arm_pmu->pmuver) for the guest in some
cases, even though userspace might have changed the guest's
ID_AA64DFR0_EL1.PMUVer (kvm->arch.dfr0_pmuver.imp).
To fix [A], KVM will set the default value of the guest's
ID_AA64DFR0_EL1.PMUVer to the PMUVer of the guest's PMU
(kvm->arch.arm_pmu->pmuver).
To fix [B], KVM will stop using kvm->arch.arm_pmu->pmuver (except
for some special cases) and use ID_AA64DFR0_EL1.PMUVer for the
guest instead.
Patch 1 adds a helper to set a PMU for the guest. This helper will
make it easier for the following patches to modify the relevant
code.
Patch 2 make the default PMU for the guest set on the first
vCPU reset. As userspace can get the value of ID_AA64DFR0_EL1
after the initial vCPU reset, this change is to make the
default PMUVer value based on the guest's PMU available on
the initial vCPU reset.
Patch 3 and 4 fix the issue [A] and [B] respectively.
The series is based on v6.4-rc3.
The patches in this series were originally included as part of [1].
[1] https://lore.kernel.org/all/20230211031506.4159098-1-reijiw@google.com/
Reiji Watanabe (4):
KVM: arm64: PMU: Introduce a helper to set the guest's PMU
KVM: arm64: PMU: Set the default PMU for the guest on vCPU reset
KVM: arm64: PMU: Use PMUVer of the guest's PMU for ID_AA64DFR0.PMUVer
KVM: arm64: PMU: Don't use the PMUVer of the PMU set for guest
arch/arm64/include/asm/kvm_host.h | 2 +
arch/arm64/kvm/arm.c | 6 ---
arch/arm64/kvm/pmu-emul.c | 73 +++++++++++++++++++++----------
arch/arm64/kvm/reset.c | 20 ++++++---
arch/arm64/kvm/sys_regs.c | 48 +++++++++++++-------
include/kvm/arm_pmu.h | 10 ++++-
6 files changed, 106 insertions(+), 53 deletions(-)
base-commit: 44c026a73be8038f03dbdeef028b642880cf1511
--
2.41.0.rc0.172.g3f132b7071-goog
More information about the linux-arm-kernel
mailing list