]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
KVM: x86: Fix perfctr WRMSR for running counters
authorEric Hankland <ehankland@google.com>
Mon, 27 Jan 2020 21:22:56 +0000 (13:22 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 5 Feb 2020 15:01:15 +0000 (16:01 +0100)
Correct the logic in intel_pmu_set_msr() for fixed and general purpose
counters. This was recently changed to set pmc->counter without taking
in to account the value of pmc_read_counter() which will be incorrect if
the counter is currently running and non-zero; this changes back to the
old logic which accounted for the value of currently running counters.

Signed-off-by: Eric Hankland <ehankland@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx/pmu_intel.c

index 34a3a17bb6d70570e7d16b47249af5219e28584c..fd21cdb10b794407328f66a711a62107ac055053 100644 (file)
@@ -260,13 +260,12 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                break;
        default:
                if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0))) {
-                       if (msr_info->host_initiated)
-                               pmc->counter = data;
-                       else
-                               pmc->counter = (s32)data;
+                       if (!msr_info->host_initiated)
+                               data = (s64)(s32)data;
+                       pmc->counter += data - pmc_read_counter(pmc);
                        return 0;
                } else if ((pmc = get_fixed_pmc(pmu, msr))) {
-                       pmc->counter = data;
+                       pmc->counter += data - pmc_read_counter(pmc);
                        return 0;
                } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) {
                        if (data == pmc->eventsel)