Hi Akihiko, On Sun, Sep 20, 2026 at 08:15:49PM +0900, Akihiko Odaki wrote: > This reverts commit fe53538069bb4f625bc8734103ba044a83138fea. > > Restore PMU event teardown before system-register reset so existing > perf events cannot retain configuration from the previous run. All > counters are disabled by the reset PMCR_EL0 and MDCR_EL2 values, so > reset does not need to request a PMU reload.
Sorry, I'm not following the intent here. KVM_REQ_RELOAD_PMU should already be discarding + recomputing perf events based on the state of the vPMU. What's the problem? Thanks, Oliver > Assisted-by: Codex:gpt-6-astra > Signed-off-by: Akihiko Odaki <[email protected]> > --- > arch/arm64/kvm/pmu-emul.c | 14 ++++++++++++++ > arch/arm64/kvm/reset.c | 3 +++ > arch/arm64/kvm/sys_regs.c | 3 --- > include/kvm/arm_pmu.h | 2 ++ > 4 files changed, 19 insertions(+), 3 deletions(-) > > diff --git a/arch/arm64/kvm/pmu-emul.c b/arch/arm64/kvm/pmu-emul.c > index a5ccb6ae44d5..14fcdbdb4587 100644 > --- a/arch/arm64/kvm/pmu-emul.c > +++ b/arch/arm64/kvm/pmu-emul.c > @@ -258,6 +258,20 @@ void kvm_pmu_vcpu_init(struct kvm_vcpu *vcpu) > pmu->pmc[i].idx = i; > } > > +/** > + * kvm_pmu_vcpu_reset - reset pmu state for cpu > + * @vcpu: The vcpu pointer > + * > + */ > +void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu) > +{ > + unsigned long mask = kvm_pmu_implemented_counter_mask(vcpu); > + int i; > + > + for_each_set_bit(i, &mask, 32) > + kvm_pmu_stop_counter(kvm_vcpu_idx_to_pmc(vcpu, i)); > +} > + > /** > * kvm_pmu_vcpu_destroy - free perf event of PMU for cpu > * @vcpu: The vcpu pointer > diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c > index 10eb7249aa9e..adcb460a5287 100644 > --- a/arch/arm64/kvm/reset.c > +++ b/arch/arm64/kvm/reset.c > @@ -185,6 +185,9 @@ void kvm_reset_vcpu(struct kvm_vcpu *vcpu) > vcpu->arch.reset_state.reset = false; > spin_unlock(&vcpu->arch.mp_state_lock); > > + /* Reset PMU outside of the non-preemptible section */ > + kvm_pmu_vcpu_reset(vcpu); > + > preempt_disable(); > loaded = (vcpu->cpu != -1); > if (loaded) > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c > index 1481dd5c99a8..75624725adf1 100644 > --- a/arch/arm64/kvm/sys_regs.c > +++ b/arch/arm64/kvm/sys_regs.c > @@ -5388,9 +5388,6 @@ void kvm_reset_sys_regs(struct kvm_vcpu *vcpu) > } > > set_bit(KVM_ARCH_FLAG_ID_REGS_INITIALIZED, &kvm->arch.flags); > - > - if (kvm_vcpu_has_pmu(vcpu)) > - kvm_make_request(KVM_REQ_RELOAD_PMU, vcpu); > } > > /** > diff --git a/include/kvm/arm_pmu.h b/include/kvm/arm_pmu.h > index 6b4a118d17ca..51f5e4ca3326 100644 > --- a/include/kvm/arm_pmu.h > +++ b/include/kvm/arm_pmu.h > @@ -48,6 +48,7 @@ u64 kvm_pmu_implemented_counter_mask(struct kvm_vcpu *vcpu); > u64 kvm_pmu_accessible_counter_mask(struct kvm_vcpu *vcpu); > u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmceid1); > void kvm_pmu_vcpu_init(struct kvm_vcpu *vcpu); > +void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu); > void kvm_pmu_vcpu_destroy(struct kvm_vcpu *vcpu); > void kvm_pmu_reprogram_counter_mask(struct kvm_vcpu *vcpu, u64 val); > void kvm_pmu_flush_hwstate(struct kvm_vcpu *vcpu); > @@ -125,6 +126,7 @@ static inline u64 kvm_pmu_accessible_counter_mask(struct > kvm_vcpu *vcpu) > return 0; > } > static inline void kvm_pmu_vcpu_init(struct kvm_vcpu *vcpu) {} > +static inline void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu) {} > static inline void kvm_pmu_vcpu_destroy(struct kvm_vcpu *vcpu) {} > static inline void kvm_pmu_reprogram_counter_mask(struct kvm_vcpu *vcpu, u64 > val) {} > static inline void kvm_pmu_flush_hwstate(struct kvm_vcpu *vcpu) {} > > -- > 2.55.0 >

