On Sat, 7 Dec 2024 09:47:10 -0500 Steven Rostedt <rostedt@xxxxxxxxxxx> wrote: > On Sat, 7 Dec 2024 15:51:36 +0900 > Masami Hiramatsu (Google) <mhiramat@xxxxxxxxxx> wrote: > > > This checks the handler is called with preempt off. > > > > On x86_64, the ftrace_graph_func calls function_graph_enter_regs() with > > ftrace_test_recursion_trylock() as below; > > > > void ftrace_graph_func(unsigned long ip, unsigned long parent_ip, > > struct ftrace_ops *op, struct ftrace_regs *fregs) > > { > > struct pt_regs *regs = &arch_ftrace_regs(fregs)->regs; > > unsigned long *stack = (unsigned long *)kernel_stack_pointer(regs); > > unsigned long return_hooker = (unsigned long)&return_to_handler; > > unsigned long *parent = (unsigned long *)stack; > > int bit; > > > > if (unlikely(skip_ftrace_return())) > > return; > > > > bit = ftrace_test_recursion_trylock(ip, *parent); > > if (bit < 0) > > return; > > > > if (!function_graph_enter_regs(*parent, ip, 0, parent, fregs)) > > *parent = return_hooker; > > > > ftrace_test_recursion_unlock(bit); > > } > > > > However, arm64 version does not; > > Hmm, I think we can move that recursion check out of the arch/x86 code > and into ftrace_graph_enter_regs(). OK, that's reasonable. Thanks, > > -- Steve -- Masami Hiramatsu (Google) <mhiramat@xxxxxxxxxx>