| From 4911f31ed987eb097b2bb3f86bf8bf51c27e068e Mon Sep 17 00:00:00 2001 |
| From: Kim Phillips <kim.phillips@amd.com> |
| Date: Wed, 23 Oct 2019 10:09:54 -0500 |
| Subject: [PATCH] perf/x86/amd/ibs: Fix reading of the IBS OpData register and |
| thus precise RIP validity |
| |
| commit 317b96bb14303c7998dbcd5bc606bd8038fdd4b4 upstream. |
| |
| The loop that reads all the IBS MSRs into *buf stopped one MSR short of |
| reading the IbsOpData register, which contains the RipInvalid status bit. |
| |
| Fix the offset_max assignment so the MSR gets read, so the RIP invalid |
| evaluation is based on what the IBS h/w output, instead of what was |
| left in memory. |
| |
| Signed-off-by: Kim Phillips <kim.phillips@amd.com> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Arnaldo Carvalho de Melo <acme@kernel.org> |
| Cc: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Cc: Borislav Petkov <bp@alien8.de> |
| Cc: H. Peter Anvin <hpa@zytor.com> |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Cc: Namhyung Kim <namhyung@kernel.org> |
| Cc: Stephane Eranian <eranian@google.com> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Vince Weaver <vincent.weaver@maine.edu> |
| Fixes: d47e8238cd76 ("perf/x86-ibs: Take instruction pointer from ibs sample") |
| Link: https://lkml.kernel.org/r/20191023150955.30292-1-kim.phillips@amd.com |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c |
| index 5b35b7ea5d72..98ba21a588a1 100644 |
| --- a/arch/x86/events/amd/ibs.c |
| +++ b/arch/x86/events/amd/ibs.c |
| @@ -614,7 +614,7 @@ static int perf_ibs_handle_irq(struct perf_ibs *perf_ibs, struct pt_regs *iregs) |
| if (event->attr.sample_type & PERF_SAMPLE_RAW) |
| offset_max = perf_ibs->offset_max; |
| else if (check_rip) |
| - offset_max = 2; |
| + offset_max = 3; |
| else |
| offset_max = 1; |
| do { |
| -- |
| 2.7.4 |
| |