FAILED: patch "[PATCH] tracing/samples: Fix creation and deletion of" failed to apply to 4.4-stable tree
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
6575257c60e1a26a5319ccf2b5ce5b6449001017Mon Sep 17 00:00:00 2001
From: "Steven Rostedt (VMware)" <[email protected]>
Date: Tue, 17 Oct 2017 14:55:24 -0400
Subject: [PATCH] tracing/samples: Fix creation and deletion of
simple_thread_fn creation
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.
samples/trace_events/trace-events-sample.c +11 -3
@@ -78,29 +78,37 @@ static int simple_thread_fn(void *arg) }static DEFINE_MUTEX (thread_mutex); +static bool simple_thread_cnt;int 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);return 0 ; }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); }