From: Like Xu <likexu@xxxxxxxxxxx> More and more vPMU emulations are deferred to kvm_pmu_handle_event() as it reduces the overhead of repeated execution. The reprogram_counter() is only responsible for creating the required perf_event, and naturally doesn't include the counter overflow part from emulated instruction events. Prior to this change, the assignment of pmc->prev_counter always occurred after pmc was enabled, and to keep the same semantics, pmc->prev_counter always needed to be reset after it has taken effect. No functional change intended. Signed-off-by: Like Xu <likexu@xxxxxxxxxxx> --- arch/x86/kvm/pmu.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index a1a79b5f49d7..d1c89a6625a0 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -418,9 +418,6 @@ static void reprogram_counter(struct kvm_pmc *pmc) if (!event_is_allowed(pmc)) goto reprogram_complete; - if (pmc->counter < pmc->prev_counter) - __kvm_perf_overflow(pmc, false); - if (eventsel & ARCH_PERFMON_EVENTSEL_PIN_CONTROL) printk_once("kvm pmu: pin control bit is ignored\n"); @@ -458,6 +455,13 @@ static void reprogram_counter(struct kvm_pmc *pmc) reprogram_complete: clear_bit(pmc->idx, (unsigned long *)&pmc_to_pmu(pmc)->reprogram_pmi); +} + +static inline void kvm_pmu_handle_pmc_overflow(struct kvm_pmc *pmc) +{ + if (pmc->counter < pmc->prev_counter) + __kvm_perf_overflow(pmc, false); + pmc->prev_counter = 0; } @@ -475,6 +479,7 @@ void kvm_pmu_handle_event(struct kvm_vcpu *vcpu) } reprogram_counter(pmc); + kvm_pmu_handle_pmc_overflow(pmc); } /* -- 2.39.2