lkml.org 
[lkml]   [2020]   [Oct]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 06/11 v2] livepatch/ftrace: Add recursion protection to the ftrace callback
    From: "Steven Rostedt (VMware)" <rostedt@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 change. It will expect that handlers
    provide their own recursion protection, unless its ftrace_ops states
    otherwise.

    Link: https://lkml.kernel.org/r/20201028115613.291169246@goodmis.org

    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Jiri Kosina <jikos@kernel.org>
    Cc: Miroslav Benes <mbenes@suse.cz>
    Cc: Joe Lawrence <joe.lawrence@redhat.com>
    Cc: live-patching@vger.kernel.org
    Reviewed-by: Petr Mladek <pmladek@suse.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@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

    \
     
     \ /
      Last update: 2020-10-30 22:41    [W:4.797 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site