diff options
Diffstat (limited to 'kernel/trace/trace_osnoise.c')
| -rw-r--r-- | kernel/trace/trace_osnoise.c | 26 | 
1 files changed, 18 insertions, 8 deletions
| diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c index 7520d43aed55..870a08da5b48 100644 --- a/kernel/trace/trace_osnoise.c +++ b/kernel/trace/trace_osnoise.c @@ -138,8 +138,7 @@ static void osnoise_unregister_instance(struct trace_array *tr)  	if (!found)  		return; -	synchronize_rcu(); -	kfree(inst); +	kvfree_rcu(inst);  }  /* @@ -1701,7 +1700,7 @@ static int start_kthread(unsigned int cpu)  		snprintf(comm, 24, "osnoise/%d", cpu);  	} -	kthread = kthread_create_on_cpu(main, NULL, cpu, comm); +	kthread = kthread_run_on_cpu(main, NULL, cpu, comm);  	if (IS_ERR(kthread)) {  		pr_err(BANNER "could not start sampling thread\n"); @@ -1710,7 +1709,6 @@ static int start_kthread(unsigned int cpu)  	}  	per_cpu(per_cpu_osnoise_var, cpu).kthread = kthread; -	wake_up_process(kthread);  	return 0;  } @@ -2123,6 +2121,13 @@ out_unhook_irq:  	return -EINVAL;  } +static void osnoise_unhook_events(void) +{ +	unhook_thread_events(); +	unhook_softirq_events(); +	unhook_irq_events(); +} +  /*   * osnoise_workload_start - start the workload and hook to events   */ @@ -2155,7 +2160,14 @@ static int osnoise_workload_start(void)  	retval = start_per_cpu_kthreads();  	if (retval) { -		unhook_irq_events(); +		trace_osnoise_callback_enabled = false; +		/* +		 * Make sure that ftrace_nmi_enter/exit() see +		 * trace_osnoise_callback_enabled as false before continuing. +		 */ +		barrier(); + +		osnoise_unhook_events();  		return retval;  	} @@ -2186,9 +2198,7 @@ static void osnoise_workload_stop(void)  	stop_per_cpu_kthreads(); -	unhook_irq_events(); -	unhook_softirq_events(); -	unhook_thread_events(); +	osnoise_unhook_events();  }  static void osnoise_tracer_start(struct trace_array *tr) |