|
|
@@ -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);
|
|
|
#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;
|
|
|
}
|
|
|
NOKPROBE_SYMBOL(setjmp_pre_handler);
|
|
|
@@ -642,6 +651,8 @@ int longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
|
|
|
* saved 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();
|
|
|
return 1;
|
|
|
}
|