Messages in this thread Patch in this message | | | Subject | [PATCH] x86: Get bp from the IRQ regs instead of directly from the CPU | From | Soeren Sandmann <> | Date | 22 Oct 2009 18:38:22 +0200 |
| |
Passing 0 for bp causes dump_trace() to get bp directly from the hardware register. This leads to the IRQ stack being included in the generated call chains, which means the stack looks something like this:
[ ip ] [ IRQ stack ] [ rest of stack trace ]
which is incorrect and confusing to user space.
Getting bp from the IRQ regs instead makes the tracing start after the IRQ stack:
[ ip ] [ rest of stack trace ]
Signed-off-by: Søren Sandmann Pedersen <sandmann@redhat.com> --- arch/x86/kernel/cpu/perf_event.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index b5801c3..39b1d0c 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c @@ -2177,10 +2177,18 @@ static const struct stacktrace_ops backtrace_ops = { static void perf_callchain_kernel(struct pt_regs *regs, struct perf_callchain_entry *entry) { + unsigned long bp; + callchain_store(entry, PERF_CONTEXT_KERNEL); callchain_store(entry, regs->ip); - dump_trace(NULL, regs, NULL, 0, &backtrace_ops, entry); +#ifdef CONFIG_FRAME_POINTER + bp = regs->bp; +#else + bp = 0; +#endif + + dump_trace(NULL, regs, NULL, bp, &backtrace_ops, entry); } /* -- 1.6.5.rc2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |