]> git.baikalelectronics.ru Git - kernel.git/commitdiff
perf/x86/intel: Avoid rewriting DEBUGCTL with the same value for LBRs
authorAndi Kleen <ak@linux.intel.com>
Fri, 20 Mar 2015 17:11:24 +0000 (10:11 -0700)
committerIngo Molnar <mingo@kernel.org>
Thu, 2 Apr 2015 15:33:20 +0000 (17:33 +0200)
perf with LBRs on has a tendency to rewrite the DEBUGCTL MSR with
the same value. Add a little optimization to skip the unnecessary
write.

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/1426871484-21285-2-git-send-email-andi@firstfloor.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/kernel/cpu/perf_event_intel_lbr.c

index 3d537252f0119a96e55fee271b7cd9ec7ea48ffb..94e5b506caa6d13206956095e646bfacbf558fb1 100644 (file)
@@ -135,7 +135,7 @@ static void intel_pmu_lbr_filter(struct cpu_hw_events *cpuc);
 static void __intel_pmu_lbr_enable(bool pmi)
 {
        struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
-       u64 debugctl, lbr_select = 0;
+       u64 debugctl, lbr_select = 0, orig_debugctl;
 
        /*
         * No need to reprogram LBR_SELECT in a PMI, as it
@@ -147,6 +147,7 @@ static void __intel_pmu_lbr_enable(bool pmi)
        }
 
        rdmsrl(MSR_IA32_DEBUGCTLMSR, debugctl);
+       orig_debugctl = debugctl;
        debugctl |= DEBUGCTLMSR_LBR;
        /*
         * LBR callstack does not work well with FREEZE_LBRS_ON_PMI.
@@ -155,7 +156,8 @@ static void __intel_pmu_lbr_enable(bool pmi)
         */
        if (!(lbr_select & LBR_CALL_STACK))
                debugctl |= DEBUGCTLMSR_FREEZE_LBRS_ON_PMI;
-       wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctl);
+       if (orig_debugctl != debugctl)
+               wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctl);
 }
 
 static void __intel_pmu_lbr_disable(void)