lkml.org 
[lkml]   [2017]   [May]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 098/103] tracing/kprobes: Enforce kprobes teardown after testing
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Thomas Gleixner <tglx@linutronix.de>

    commit 30e7d894c1478c88d50ce94ddcdbd7f9763d9cdd upstream.

    Enabling the tracer selftest triggers occasionally the warning in
    text_poke(), which warns when the to be modified page is not marked
    reserved.

    The reason is that the tracer selftest installs kprobes on functions marked
    __init for testing. These probes are removed after the tests, but that
    removal schedules the delayed kprobes_optimizer work, which will do the
    actual text poke. If the work is executed after the init text is freed,
    then the warning triggers. The bug can be reproduced reliably when the work
    delay is increased.

    Flush the optimizer work and wait for the optimizing/unoptimizing lists to
    become empty before returning from the kprobes tracer selftest. That
    ensures that all operations which were queued due to the probes removal
    have completed.

    Link: http://lkml.kernel.org/r/20170516094802.76a468bb@gandalf.local.home

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
    Fixes: 6274de498 ("kprobes: Support delayed unoptimizing")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    include/linux/kprobes.h | 4 +++-
    kernel/kprobes.c | 2 +-
    kernel/trace/trace_kprobe.c | 5 +++++
    3 files changed, 9 insertions(+), 2 deletions(-)

    --- a/include/linux/kprobes.h
    +++ b/include/linux/kprobes.h
    @@ -330,7 +330,9 @@ extern int proc_kprobes_optimization_han
    int write, void __user *buffer,
    size_t *length, loff_t *ppos);
    #endif
    -
    +extern void wait_for_kprobe_optimizer(void);
    +#else
    +static inline void wait_for_kprobe_optimizer(void) { }
    #endif /* CONFIG_OPTPROBES */
    #ifdef CONFIG_KPROBES_ON_FTRACE
    extern void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
    --- a/kernel/kprobes.c
    +++ b/kernel/kprobes.c
    @@ -563,7 +563,7 @@ static void kprobe_optimizer(struct work
    }

    /* Wait for completing optimization and unoptimization */
    -static void wait_for_kprobe_optimizer(void)
    +void wait_for_kprobe_optimizer(void)
    {
    mutex_lock(&kprobe_mutex);

    --- a/kernel/trace/trace_kprobe.c
    +++ b/kernel/trace/trace_kprobe.c
    @@ -1471,6 +1471,11 @@ static __init int kprobe_trace_self_test

    end:
    release_all_trace_kprobes();
    + /*
    + * Wait for the optimizer work to finish. Otherwise it might fiddle
    + * with probes in already freed __init text.
    + */
    + wait_for_kprobe_optimizer();
    if (warn)
    pr_cont("NG: Some tests are failed. Please check them.\n");
    else

    \
     
     \ /
      Last update: 2017-05-23 23:20    [W:4.328 / U:25.596 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site