Skip to content

Commit f9ea835

Browse files
reijiw-kvmoupton
authored andcommitted
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: d0c94c4 ("KVM: arm64: Restore PMU configuration on first run") Cc: [email protected] Reviewed-by: Marc Zyngier <[email protected]> Signed-off-by: Reiji Watanabe <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 8c2e8ac commit f9ea835

File tree

2 files changed

+1
-1
lines changed

2 files changed

+1
-1
lines changed

arch/arm64/kvm/pmu-emul.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,7 @@ void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val)
558558
for_each_set_bit(i, &mask, 32)
559559
kvm_pmu_set_pmc_value(kvm_vcpu_idx_to_pmc(vcpu, i), 0, true);
560560
}
561+
kvm_vcpu_pmu_restore_guest(vcpu);
561562
}
562563

563564
static bool kvm_pmu_counter_is_enabled(struct kvm_pmc *pmc)

arch/arm64/kvm/sys_regs.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,6 @@ static bool access_pmcr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
794794
if (!kvm_supports_32bit_el0())
795795
val |= ARMV8_PMU_PMCR_LC;
796796
kvm_pmu_handle_pmcr(vcpu, val);
797-
kvm_vcpu_pmu_restore_guest(vcpu);
798797
} else {
799798
/* PMCR.P & PMCR.C are RAZ */
800799
val = __vcpu_sys_reg(vcpu, PMCR_EL0)

0 commit comments

Comments
 (0)