KVM: x86: Fix wrong/stuck PMU when guest does not use PMI
[sfrench/cifs-2.6.git] / arch / x86 / kvm / pmu.c
index 5c4f63151b4d90a405808bda13daa911c5b2a131..cbecaa90399c1fbb1555ea5309a43f392f36fda2 100644 (file)
@@ -108,7 +108,10 @@ static void kvm_perf_overflow(struct perf_event *perf_event,
 {
        struct kvm_pmc *pmc = perf_event->overflow_handler_context;
        struct kvm_pmu *pmu = &pmc->vcpu->arch.pmu;
-       __set_bit(pmc->idx, (unsigned long *)&pmu->global_status);
+       if (!test_and_set_bit(pmc->idx, (unsigned long *)&pmu->reprogram_pmi)) {
+               __set_bit(pmc->idx, (unsigned long *)&pmu->global_status);
+               kvm_make_request(KVM_REQ_PMU, pmc->vcpu);
+       }
 }
 
 static void kvm_perf_overflow_intr(struct perf_event *perf_event,
@@ -117,7 +120,7 @@ static void kvm_perf_overflow_intr(struct perf_event *perf_event,
        struct kvm_pmc *pmc = perf_event->overflow_handler_context;
        struct kvm_pmu *pmu = &pmc->vcpu->arch.pmu;
        if (!test_and_set_bit(pmc->idx, (unsigned long *)&pmu->reprogram_pmi)) {
-               kvm_perf_overflow(perf_event, data, regs);
+               __set_bit(pmc->idx, (unsigned long *)&pmu->global_status);
                kvm_make_request(KVM_REQ_PMU, pmc->vcpu);
                /*
                 * Inject PMI. If vcpu was in a guest mode during NMI PMI