diff options
Diffstat (limited to 'kernel/trace/trace_benchmark.c')
| -rw-r--r-- | kernel/trace/trace_benchmark.c | 26 | 
1 files changed, 24 insertions, 2 deletions
diff --git a/kernel/trace/trace_benchmark.c b/kernel/trace/trace_benchmark.c index 0f109c4130d3..e3b488825ae3 100644 --- a/kernel/trace/trace_benchmark.c +++ b/kernel/trace/trace_benchmark.c @@ -21,6 +21,8 @@ static u64 bm_stddev;  static unsigned int bm_avg;  static unsigned int bm_std; +static bool ok_to_run; +  /*   * This gets called in a loop recording the time it took to write   * the tracepoint. What it writes is the time statistics of the last @@ -164,11 +166,21 @@ static int benchmark_event_kthread(void *arg)   * When the benchmark tracepoint is enabled, it calls this   * function and the thread that calls the tracepoint is created.   */ -void trace_benchmark_reg(void) +int trace_benchmark_reg(void)  { +	if (!ok_to_run) { +		pr_warning("trace benchmark cannot be started via kernel command line\n"); +		return -EBUSY; +	} +  	bm_event_thread = kthread_run(benchmark_event_kthread,  				      NULL, "event_benchmark"); -	WARN_ON(!bm_event_thread); +	if (!bm_event_thread) { +		pr_warning("trace benchmark failed to create kernel thread\n"); +		return -ENOMEM; +	} + +	return 0;  }  /* @@ -182,6 +194,7 @@ void trace_benchmark_unreg(void)  		return;  	kthread_stop(bm_event_thread); +	bm_event_thread = NULL;  	strcpy(bm_str, "START");  	bm_total = 0; @@ -196,3 +209,12 @@ void trace_benchmark_unreg(void)  	bm_avg = 0;  	bm_stddev = 0;  } + +static __init int ok_to_run_trace_benchmark(void) +{ +	ok_to_run = true; + +	return 0; +} + +early_initcall(ok_to_run_trace_benchmark);  |