diff options
Diffstat (limited to 'arch/x86/kvm/pmu.c')
-rw-r--r-- | arch/x86/kvm/pmu.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index 5c4f63151b4d..cbecaa90399c 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c | |||
@@ -108,7 +108,10 @@ static void kvm_perf_overflow(struct perf_event *perf_event, | |||
108 | { | 108 | { |
109 | struct kvm_pmc *pmc = perf_event->overflow_handler_context; | 109 | struct kvm_pmc *pmc = perf_event->overflow_handler_context; |
110 | struct kvm_pmu *pmu = &pmc->vcpu->arch.pmu; | 110 | struct kvm_pmu *pmu = &pmc->vcpu->arch.pmu; |
111 | __set_bit(pmc->idx, (unsigned long *)&pmu->global_status); | 111 | if (!test_and_set_bit(pmc->idx, (unsigned long *)&pmu->reprogram_pmi)) { |
112 | __set_bit(pmc->idx, (unsigned long *)&pmu->global_status); | ||
113 | kvm_make_request(KVM_REQ_PMU, pmc->vcpu); | ||
114 | } | ||
112 | } | 115 | } |
113 | 116 | ||
114 | static void kvm_perf_overflow_intr(struct perf_event *perf_event, | 117 | 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, | |||
117 | struct kvm_pmc *pmc = perf_event->overflow_handler_context; | 120 | struct kvm_pmc *pmc = perf_event->overflow_handler_context; |
118 | struct kvm_pmu *pmu = &pmc->vcpu->arch.pmu; | 121 | struct kvm_pmu *pmu = &pmc->vcpu->arch.pmu; |
119 | if (!test_and_set_bit(pmc->idx, (unsigned long *)&pmu->reprogram_pmi)) { | 122 | if (!test_and_set_bit(pmc->idx, (unsigned long *)&pmu->reprogram_pmi)) { |
120 | kvm_perf_overflow(perf_event, data, regs); | 123 | __set_bit(pmc->idx, (unsigned long *)&pmu->global_status); |
121 | kvm_make_request(KVM_REQ_PMU, pmc->vcpu); | 124 | kvm_make_request(KVM_REQ_PMU, pmc->vcpu); |
122 | /* | 125 | /* |
123 | * Inject PMI. If vcpu was in a guest mode during NMI PMI | 126 | * Inject PMI. If vcpu was in a guest mode during NMI PMI |