From: "Steven Rostedt (VMware)" <rost...@goodmis.org> If a ftrace callback does not supply its own recursion protection and does not set the RECURSION_SAFE flag in its ftrace_ops, then ftrace will make a helper trampoline to do so before calling the callback instead of just calling the callback directly.
The default for ftrace_ops is going to assume recursion protection unless otherwise specified. Cc: Josh Poimboeuf <jpoim...@redhat.com> Cc: Jiri Kosina <ji...@kernel.org> Cc: Miroslav Benes <mbe...@suse.cz> Cc: Petr Mladek <pmla...@suse.com> Cc: Joe Lawrence <joe.lawre...@redhat.com> Cc: live-patch...@vger.kernel.org Signed-off-by: Steven Rostedt (VMware) <rost...@goodmis.org> --- kernel/livepatch/patch.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/kernel/livepatch/patch.c b/kernel/livepatch/patch.c index b552cf2d85f8..6c0164d24bbd 100644 --- a/kernel/livepatch/patch.c +++ b/kernel/livepatch/patch.c @@ -45,9 +45,13 @@ static void notrace klp_ftrace_handler(unsigned long ip, struct klp_ops *ops; struct klp_func *func; int patch_state; + int bit; ops = container_of(fops, struct klp_ops, fops); + bit = ftrace_test_recursion_trylock(); + if (bit < 0) + return; /* * A variant of synchronize_rcu() is used to allow patching functions * where RCU is not watching, see klp_synchronize_transition(). @@ -117,6 +121,7 @@ static void notrace klp_ftrace_handler(unsigned long ip, unlock: preempt_enable_notrace(); + ftrace_test_recursion_unlock(bit); } /* -- 2.28.0