s390/ftrace: use HAVE_FUNCTION_GRAPH_RET_ADDR_PTR
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 18 Feb 2019 15:51:28 +0000 (16:51 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 2 May 2019 11:54:11 +0000 (13:54 +0200)
Make the call chain more reliable by tagging the ftrace stack entries
with the stack pointer that is associated with the return address.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/ftrace.h
arch/s390/kernel/entry.h
arch/s390/kernel/ftrace.c
arch/s390/kernel/mcount.S
arch/s390/kernel/unwind_bc.c

index 6e0ed03..68d362f 100644 (file)
@@ -11,6 +11,8 @@
 #define MCOUNT_RETURN_FIXUP    18
 #endif
 
+#define HAVE_FUNCTION_GRAPH_RET_ADDR_PTR
+
 #ifndef __ASSEMBLY__
 
 #ifdef CONFIG_CC_IS_CLANG
index c3816ae..20420c2 100644 (file)
@@ -65,7 +65,7 @@ int setup_profiling_timer(unsigned int multiplier);
 void __init time_init(void);
 int pfn_is_nosave(unsigned long);
 void s390_early_resume(void);
-unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip);
+unsigned long prepare_ftrace_return(unsigned long parent, unsigned long sp, unsigned long ip);
 
 struct s390_mmap_arg_struct;
 struct fadvise64_64_args;
index 39b13d7..1bb85f6 100644 (file)
@@ -201,17 +201,18 @@ device_initcall(ftrace_plt_init);
  * Hook the return address and push it in the stack of return addresses
  * in current thread info.
  */
-unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip)
+unsigned long prepare_ftrace_return(unsigned long ra, unsigned long sp,
+                                   unsigned long ip)
 {
        if (unlikely(ftrace_graph_is_dead()))
                goto out;
        if (unlikely(atomic_read(&current->tracing_graph_pause)))
                goto out;
        ip -= MCOUNT_INSN_SIZE;
-       if (!function_graph_enter(parent, ip, 0, NULL))
-               parent = (unsigned long) return_to_handler;
+       if (!function_graph_enter(ra, ip, 0, (void *) sp))
+               ra = (unsigned long) return_to_handler;
 out:
-       return parent;
+       return ra;
 }
 NOKPROBE_SYMBOL(prepare_ftrace_return);
 
index 09ae6da..9e1660a 100644 (file)
@@ -65,8 +65,8 @@ ENTRY(ftrace_caller)
        .globl ftrace_graph_caller
 ftrace_graph_caller:
        j       ftrace_graph_caller_end
-       lg      %r2,(STACK_PTREGS_GPRS+14*8)(%r15)
-       lg      %r3,(STACK_PTREGS_PSW+8)(%r15)
+       lmg     %r2,%r3,(STACK_PTREGS_GPRS+14*8)(%r15)
+       lg      %r4,(STACK_PTREGS_PSW+8)(%r15)
        brasl   %r14,prepare_ftrace_return
        stg     %r2,(STACK_PTREGS_GPRS+14*8)(%r15)
 ftrace_graph_caller_end:
index cf5a630..57fd4e9 100644 (file)
@@ -84,7 +84,7 @@ bool unwind_next_frame(struct unwind_state *state)
        /* Decode any ftrace redirection */
        if (ip == (unsigned long) return_to_handler)
                ip = ftrace_graph_ret_addr(state->task, &state->graph_idx,
-                                          ip, NULL);
+                                          ip, (void *) sp);
 #endif
 
        /* Update unwind state */