lkml.org 
[lkml]   [2017]   [Nov]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 16/67] tracing/samples: Fix creation and deletion of simple_thread_fn creation
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

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

    From: Steven Rostedt (VMware) <rostedt@goodmis.org>

    commit 6575257c60e1a26a5319ccf2b5ce5b6449001017 upstream.

    Commit 7496946a8 ("tracing: Add samples of DECLARE_EVENT_CLASS() and
    DEFINE_EVENT()") added template examples for all the events. It created a
    DEFINE_EVENT_FN() example which reused the foo_bar_reg and foo_bar_unreg
    functions.

    Enabling both the TRACE_EVENT_FN() and DEFINE_EVENT_FN() example trace
    events caused the foo_bar_reg to be called twice, creating the test thread
    twice. The foo_bar_unreg would remove it only once, even if it was called
    multiple times, leaving a thread existing when the module is unloaded,
    causing an oops.

    Add a ref count and allow foo_bar_reg() and foo_bar_unreg() be called by
    multiple trace events.

    Fixes: 7496946a8 ("tracing: Add samples of DECLARE_EVENT_CLASS() and DEFINE_EVENT()")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    samples/trace_events/trace-events-sample.c | 14 +++++++++++---
    1 file changed, 11 insertions(+), 3 deletions(-)

    --- a/samples/trace_events/trace-events-sample.c
    +++ b/samples/trace_events/trace-events-sample.c
    @@ -78,28 +78,36 @@ static int simple_thread_fn(void *arg)
    }

    static DEFINE_MUTEX(thread_mutex);
    +static bool simple_thread_cnt;

    void foo_bar_reg(void)
    {
    + mutex_lock(&thread_mutex);
    + if (simple_thread_cnt++)
    + goto out;
    +
    pr_info("Starting thread for foo_bar_fn\n");
    /*
    * We shouldn't be able to start a trace when the module is
    * unloading (there's other locks to prevent that). But
    * for consistency sake, we still take the thread_mutex.
    */
    - mutex_lock(&thread_mutex);
    simple_tsk_fn = kthread_run(simple_thread_fn, NULL, "event-sample-fn");
    + out:
    mutex_unlock(&thread_mutex);
    }

    void foo_bar_unreg(void)
    {
    - pr_info("Killing thread for foo_bar_fn\n");
    - /* protect against module unloading */
    mutex_lock(&thread_mutex);
    + if (--simple_thread_cnt)
    + goto out;
    +
    + pr_info("Killing thread for foo_bar_fn\n");
    if (simple_tsk_fn)
    kthread_stop(simple_tsk_fn);
    simple_tsk_fn = NULL;
    + out:
    mutex_unlock(&thread_mutex);
    }


    \
     
     \ /
      Last update: 2017-11-06 11:09    [W:4.174 / U:0.324 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site