Skip to content

Commit ce1b98a

Browse files
Stephane Eraniangregkh
authored andcommitted
perf/x86: Fix LBR related crashes on Intel Atom
commit 6fc2e83077b05a061afe9b24f2fdff7a0434eb67 upstream. This patches fixes the LBR kernel crashes on Intel Atom. The kernel was assuming that if the CPU supports 64-bit format LBR, then it has an LBR_SELECT MSR. Atom uses 64-bit LBR format but does not have LBR_SELECT. That was causing NULL pointer dereferences in a couple of places. Signed-off-by: Stephane Eranian <eranian@google.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vince Weaver <vincent.weaver@maine.edu> Cc: kan.liang@intel.com Fixes: 96f3eda ("perf/x86/intel: Fix static checker warning in lbr enable") Link: http://lkml.kernel.org/r/1449182000-31524-2-git-send-email-eranian@google.com Signed-off-by: Ingo Molnar <mingo@kernel.org> Signed-off-by: Denys Zagorui <dzagorui@cisco.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent b4cf490 commit ce1b98a

1 file changed

Lines changed: 5 additions & 3 deletions

File tree

arch/x86/kernel/cpu/perf_event_intel_lbr.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ static void __intel_pmu_lbr_enable(bool pmi)
153153
*/
154154
if (cpuc->lbr_sel)
155155
lbr_select = cpuc->lbr_sel->config;
156-
if (!pmi)
156+
if (!pmi && cpuc->lbr_sel)
157157
wrmsrl(MSR_LBR_SELECT, lbr_select);
158158

159159
rdmsrl(MSR_IA32_DEBUGCTLMSR, debugctl);
@@ -432,8 +432,10 @@ static void intel_pmu_lbr_read_64(struct cpu_hw_events *cpuc)
432432
int out = 0;
433433
int num = x86_pmu.lbr_nr;
434434

435-
if (cpuc->lbr_sel->config & LBR_CALL_STACK)
436-
num = tos;
435+
if (cpuc->lbr_sel) {
436+
if (cpuc->lbr_sel->config & LBR_CALL_STACK)
437+
num = tos;
438+
}
437439

438440
for (i = 0; i < num; i++) {
439441
unsigned long lbr_idx = (tos - i) & mask;

0 commit comments

Comments
 (0)