powerpc/ftrace: Simplify function_graph support in ftrace.c
authorNaveen N Rao <naveen@kernel.org>
Mon, 19 Jun 2023 09:47:22 +0000 (15:17 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 21 Aug 2023 14:09:05 +0000 (00:09 +1000)
Since we now support DYNAMIC_FTRACE_WITH_ARGS across ppc32 and ppc64
ELFv2, we can simplify function_graph tracer support code in ftrace.c

Signed-off-by: Naveen N Rao <naveen@kernel.org>
Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/4dc92c4b1ed444dc62b748ae7327acdb9e096864.1687166935.git.naveen@kernel.org
arch/powerpc/kernel/trace/ftrace.c

index 81a121b..f117124 100644 (file)
@@ -790,44 +790,10 @@ int __init ftrace_dyn_arch_init(void)
 #endif
 
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
-
-extern void ftrace_graph_call(void);
-extern void ftrace_graph_stub(void);
-
-static int ftrace_modify_ftrace_graph_caller(bool enable)
-{
-       unsigned long ip = (unsigned long)(&ftrace_graph_call);
-       unsigned long addr = (unsigned long)(&ftrace_graph_caller);
-       unsigned long stub = (unsigned long)(&ftrace_graph_stub);
-       ppc_inst_t old, new;
-
-       if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE_WITH_ARGS))
-               return 0;
-
-       old = ftrace_call_replace(ip, enable ? stub : addr, 0);
-       new = ftrace_call_replace(ip, enable ? addr : stub, 0);
-
-       return ftrace_modify_code(ip, old, new);
-}
-
-int ftrace_enable_ftrace_graph_caller(void)
-{
-       return ftrace_modify_ftrace_graph_caller(true);
-}
-
-int ftrace_disable_ftrace_graph_caller(void)
-{
-       return ftrace_modify_ftrace_graph_caller(false);
-}
-
-/*
- * Hook the return address and push it in the stack of return addrs
- * in current thread info. Return the address we want to divert to.
- */
-static unsigned long
-__prepare_ftrace_return(unsigned long parent, unsigned long ip, unsigned long sp)
+void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
+                      struct ftrace_ops *op, struct ftrace_regs *fregs)
 {
-       unsigned long return_hooker;
+       unsigned long sp = fregs->regs.gpr[1];
        int bit;
 
        if (unlikely(ftrace_graph_is_dead()))
@@ -836,31 +802,15 @@ __prepare_ftrace_return(unsigned long parent, unsigned long ip, unsigned long sp
        if (unlikely(atomic_read(&current->tracing_graph_pause)))
                goto out;
 
-       bit = ftrace_test_recursion_trylock(ip, parent);
+       bit = ftrace_test_recursion_trylock(ip, parent_ip);
        if (bit < 0)
                goto out;
 
-       return_hooker = ppc_function_entry(return_to_handler);
-
-       if (!function_graph_enter(parent, ip, 0, (unsigned long *)sp))
-               parent = return_hooker;
+       if (!function_graph_enter(parent_ip, ip, 0, (unsigned long *)sp))
+               parent_ip = ppc_function_entry(return_to_handler);
 
        ftrace_test_recursion_unlock(bit);
 out:
-       return parent;
+       fregs->regs.link = parent_ip;
 }
-
-#ifdef CONFIG_DYNAMIC_FTRACE_WITH_ARGS
-void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
-                      struct ftrace_ops *op, struct ftrace_regs *fregs)
-{
-       fregs->regs.link = __prepare_ftrace_return(parent_ip, ip, fregs->regs.gpr[1]);
-}
-#else
-unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip,
-                                   unsigned long sp)
-{
-       return __prepare_ftrace_return(parent, ip, sp);
-}
-#endif
 #endif /* CONFIG_FUNCTION_GRAPH_TRACER */