Commit 503f7e29 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'trace-v4.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace

Pull tracing fix from Steven Rostedt:
 "Testing a new trace event format, I triggered a bug by doing:

    # modprobe trace-events-sample
    # echo 1 > /sys/kernel/debug/tracing/events/sample-trace/enable
    # rmmod trace-events-sample

  This would cause an oops. The issue is that I added another trace
  event sample that reused a reg function of another trace event to
  create a thread to call the tracepoints. The problem was that the reg
  function couldn't handle nested calls (reg; reg; unreg; unreg;) and
  created two threads (instead of one) and only removed one on exit.

  This isn't a critical bug as the bug is only in sample code. But
  sample code should be free of known bugs to prevent others from
  copying it. This is why this is also marked for stable"

* tag 'trace-v4.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  tracing/samples: Fix creation and deletion of simple_thread_fn creation
parents ebe6e90c 6575257c
...@@ -78,29 +78,37 @@ static int simple_thread_fn(void *arg) ...@@ -78,29 +78,37 @@ static int simple_thread_fn(void *arg)
} }
static DEFINE_MUTEX(thread_mutex); static DEFINE_MUTEX(thread_mutex);
static bool simple_thread_cnt;
int foo_bar_reg(void) int foo_bar_reg(void)
{ {
mutex_lock(&thread_mutex);
if (simple_thread_cnt++)
goto out;
pr_info("Starting thread for foo_bar_fn\n"); pr_info("Starting thread for foo_bar_fn\n");
/* /*
* We shouldn't be able to start a trace when the module is * We shouldn't be able to start a trace when the module is
* unloading (there's other locks to prevent that). But * unloading (there's other locks to prevent that). But
* for consistency sake, we still take the thread_mutex. * 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"); simple_tsk_fn = kthread_run(simple_thread_fn, NULL, "event-sample-fn");
out:
mutex_unlock(&thread_mutex); mutex_unlock(&thread_mutex);
return 0; return 0;
} }
void foo_bar_unreg(void) void foo_bar_unreg(void)
{ {
pr_info("Killing thread for foo_bar_fn\n");
/* protect against module unloading */
mutex_lock(&thread_mutex); mutex_lock(&thread_mutex);
if (--simple_thread_cnt)
goto out;
pr_info("Killing thread for foo_bar_fn\n");
if (simple_tsk_fn) if (simple_tsk_fn)
kthread_stop(simple_tsk_fn); kthread_stop(simple_tsk_fn);
simple_tsk_fn = NULL; simple_tsk_fn = NULL;
out:
mutex_unlock(&thread_mutex); mutex_unlock(&thread_mutex);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment