mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	tracing/samples: Fix creation and deletion of simple_thread_fn creation
Commit7496946a8("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. Cc: stable@vger.kernel.org Fixes:7496946a8("tracing: Add samples of DECLARE_EVENT_CLASS() and DEFINE_EVENT()") Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
		
							parent
							
								
									f39b536ce9
								
							
						
					
					
						commit
						6575257c60
					
				
					 1 changed files with 11 additions and 3 deletions
				
			
		|  | @ -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); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Steven Rostedt (VMware)
						Steven Rostedt (VMware)