mirror of https://gitee.com/openkylin/linux.git
powerpc/kprobes: Pause function_graph tracing during jprobes handling
This fixes a crash when function_graph and jprobes are used together. This is essentially commit237d28db03
("ftrace/jprobes/x86: Fix conflict between jprobes and function graph tracing"), but for powerpc. Jprobes breaks function_graph tracing since the jprobe hook needs to use jprobe_return(), which never returns back to the hook, but instead to the original jprobe'd function. The solution is to momentarily pause function_graph tracing before invoking the jprobe hook and re-enable it when returning back to the original jprobe'd function. Fixes:6794c78243
("powerpc64: port of the function graph tracer") Cc: stable@vger.kernel.org # v2.6.30+ Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Acked-by: Masami Hiramatsu <mhiramat@kernel.org> Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
a093c92dc7
commit
a9f8553e93
|
@ -617,6 +617,15 @@ int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc);
|
regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* jprobes use jprobe_return() which skips the normal return
|
||||||
|
* path of the function, and this messes up the accounting of the
|
||||||
|
* function graph tracer.
|
||||||
|
*
|
||||||
|
* Pause function graph tracing while performing the jprobe function.
|
||||||
|
*/
|
||||||
|
pause_graph_tracing();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
NOKPROBE_SYMBOL(setjmp_pre_handler);
|
NOKPROBE_SYMBOL(setjmp_pre_handler);
|
||||||
|
@ -642,6 +651,8 @@ int longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
* saved regs...
|
* saved regs...
|
||||||
*/
|
*/
|
||||||
memcpy(regs, &kcb->jprobe_saved_regs, sizeof(struct pt_regs));
|
memcpy(regs, &kcb->jprobe_saved_regs, sizeof(struct pt_regs));
|
||||||
|
/* It's OK to start function graph tracing again */
|
||||||
|
unpause_graph_tracing();
|
||||||
preempt_enable_no_resched();
|
preempt_enable_no_resched();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue