diff options
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel_lbr.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_intel_lbr.c b/arch/x86/kernel/cpu/perf_event_intel_lbr.c index 3d537252f011..94e5b506caa6 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_lbr.c +++ b/arch/x86/kernel/cpu/perf_event_intel_lbr.c | |||
@@ -135,7 +135,7 @@ static void intel_pmu_lbr_filter(struct cpu_hw_events *cpuc); | |||
135 | static void __intel_pmu_lbr_enable(bool pmi) | 135 | static void __intel_pmu_lbr_enable(bool pmi) |
136 | { | 136 | { |
137 | struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events); | 137 | struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events); |
138 | u64 debugctl, lbr_select = 0; | 138 | u64 debugctl, lbr_select = 0, orig_debugctl; |
139 | 139 | ||
140 | /* | 140 | /* |
141 | * No need to reprogram LBR_SELECT in a PMI, as it | 141 | * No need to reprogram LBR_SELECT in a PMI, as it |
@@ -147,6 +147,7 @@ static void __intel_pmu_lbr_enable(bool pmi) | |||
147 | } | 147 | } |
148 | 148 | ||
149 | rdmsrl(MSR_IA32_DEBUGCTLMSR, debugctl); | 149 | rdmsrl(MSR_IA32_DEBUGCTLMSR, debugctl); |
150 | orig_debugctl = debugctl; | ||
150 | debugctl |= DEBUGCTLMSR_LBR; | 151 | debugctl |= DEBUGCTLMSR_LBR; |
151 | /* | 152 | /* |
152 | * LBR callstack does not work well with FREEZE_LBRS_ON_PMI. | 153 | * LBR callstack does not work well with FREEZE_LBRS_ON_PMI. |
@@ -155,7 +156,8 @@ static void __intel_pmu_lbr_enable(bool pmi) | |||
155 | */ | 156 | */ |
156 | if (!(lbr_select & LBR_CALL_STACK)) | 157 | if (!(lbr_select & LBR_CALL_STACK)) |
157 | debugctl |= DEBUGCTLMSR_FREEZE_LBRS_ON_PMI; | 158 | debugctl |= DEBUGCTLMSR_FREEZE_LBRS_ON_PMI; |
158 | wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctl); | 159 | if (orig_debugctl != debugctl) |
160 | wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctl); | ||
159 | } | 161 | } |
160 | 162 | ||
161 | static void __intel_pmu_lbr_disable(void) | 163 | static void __intel_pmu_lbr_disable(void) |