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(). -- Steve