|
@@ -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;
|
|
|
}
|