Messages in this thread | | | Date | Fri, 23 Oct 2009 12:50:47 +0200 | From | Ingo Molnar <> | Subject | Re: [PATCH] x86: Get bp from the IRQ regs instead of directly from the CPU |
| |
* Soeren Sandmann <sandmann@daimi.au.dk> wrote:
> 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>
Indeed, nice catch!
> --- > 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); > }
Wouldnt it be better to push this logic into dump_trace() itself? That way other ways of backtrace generation would be improved as well, not just perf events call-chains.
Ingo -- 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/
| |