perf/x86/intel: Reset more state in PMU reset
authorAndi Kleen <ak@linux.intel.com>
Fri, 27 Feb 2015 17:48:30 +0000 (09:48 -0800)
committerIngo Molnar <mingo@kernel.org>
Thu, 2 Apr 2015 15:33:16 +0000 (17:33 +0200)
The PMU reset code didn't quite keep up with newer PMU features.
Improve it a bit to really reset a modern PMU:

  - Clear all overflow status
  - Clear LBRs and freezing state
  - Disable fixed counters too

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: eranian@google.com
Link: http://lkml.kernel.org/r/1425059312-18217-2-git-send-email-andi@firstfloor.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/kernel/cpu/perf_event_intel.c

index 6ea61a572fb0ee36afaccaa1af7c0d94ef577971..59994602bb94361185e86ba5726408490e7662ee 100644 (file)
@@ -1538,6 +1538,18 @@ static void intel_pmu_reset(void)
        if (ds)
                ds->bts_index = ds->bts_buffer_base;
 
+       /* Ack all overflows and disable fixed counters */
+       if (x86_pmu.version >= 2) {
+               intel_pmu_ack_status(intel_pmu_get_status());
+               wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0);
+       }
+
+       /* Reset LBRs and LBR freezing */
+       if (x86_pmu.lbr_nr) {
+               update_debugctlmsr(get_debugctlmsr() &
+                       ~(DEBUGCTLMSR_FREEZE_LBRS_ON_PMI|DEBUGCTLMSR_LBR));
+       }
+
        local_irq_restore(flags);
 }