summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2010-03-04 12:27:39 +0100
committerIngo Molnar <mingo@elte.hu>2010-03-04 12:27:39 +0100
commit3e75c3b0ca669ce675c52ad36a7998f55f16757f (patch)
treecffc3b6805867e7920928e0dc5fb35a1b1625d1b /arch
parentperf trace: Don't use pager if scripting (diff)
parentx86/stacktrace: Don't dereference bad frame pointers (diff)
downloadlinux-3e75c3b0ca669ce675c52ad36a7998f55f16757f.tar.xz
linux-3e75c3b0ca669ce675c52ad36a7998f55f16757f.zip
Merge branch 'perf/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into perf/urgent
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kernel/dumpstack_64.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
index 676bc051252e..2012a4ed2727 100644
--- a/arch/x86/kernel/dumpstack_64.c
+++ b/arch/x86/kernel/dumpstack_64.c
@@ -120,9 +120,15 @@ fixup_bp_irq_link(unsigned long bp, unsigned long *stack,
{
#ifdef CONFIG_FRAME_POINTER
struct stack_frame *frame = (struct stack_frame *)bp;
+ unsigned long next;
- if (!in_irq_stack(stack, irq_stack, irq_stack_end))
- return (unsigned long)frame->next_frame;
+ if (!in_irq_stack(stack, irq_stack, irq_stack_end)) {
+ if (!probe_kernel_address(&frame->next_frame, next))
+ return next;
+ else
+ WARN_ONCE(1, "Perf: bad frame pointer = %p in "
+ "callchain\n", &frame->next_frame);
+ }
#endif
return bp;
}