s390/ftrace/jprobes: Fix conflict between jprobes and function graph tracing
authorJiri Olsa <jolsa@kernel.org>
Sun, 31 Jul 2016 12:52:53 +0000 (14:52 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 10 Nov 2018 15:39:13 +0000 (07:39 -0800)
[ Upstream commit e64a5470dcd2900ab8f8f83638c00098b10e6300 ]

This fixes the same issue Steven already fixed for x86
in following commit:

  237d28db036e ftrace/jprobes/x86: Fix conflict between jprobes and function graph tracing

It fixes the crash, that happens when function graph tracing
and jprobes are used simultaneously. Please refer to above
commit for details.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/s390/kernel/kprobes.c

index 014d4729b134d0abb526044f64d4e81a7a262261..ee03d8f0ee6053a3a4c682cc6a9174524f5f046b 100644 (file)
@@ -633,6 +633,15 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
        stack = (unsigned long) regs->gprs[15];
 
        memcpy(kcb->jprobes_stack, (void *) stack, MIN_STACK_SIZE(stack));
+
+       /*
+        * jprobes use jprobe_return() which skips the normal return
+        * path of the function, and this messes up the accounting of the
+        * function graph tracer to get messed up.
+        *
+        * Pause function graph tracing while performing the jprobe function.
+        */
+       pause_graph_tracing();
        return 1;
 }
 
@@ -646,6 +655,9 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
        struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
        unsigned long stack;
 
+       /* It's OK to start function graph tracing again */
+       unpause_graph_tracing();
+
        stack = (unsigned long) kcb->jprobe_saved_regs.gprs[15];
 
        /* Put the regs back */