[PATCH 2/4] tracing: Do not start benchmark on boot up

From: Steven Rostedt
Date: Tue Nov 29 2016 - 10:00:31 EST


From: "Steven Rostedt (Red Hat)" <rostedt@xxxxxxxxxxx>

Trace events are enabled every early on boot up via the boot command line
parameter. The benchmark tool creates a new thread to perform the trace
event benchmarking. But at start up, it is called before scheduling is set
up and this crashes the kerenl.

Have the benchmark fail to register when started via the kernel command
line.

Also, since the registering of a tracepoint now can handle failure cases,
return -ENOMEM instead of warning if the thread can not be created.

Signed-off-by: Steven Rostedt <rostedt@xxxxxxxxxxx>
---
kernel/trace/trace_benchmark.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/trace_benchmark.c b/kernel/trace/trace_benchmark.c
index f76d0416dd83..2bc7dc3e8ff8 100644
--- a/kernel/trace/trace_benchmark.c
+++ b/kernel/trace/trace_benchmark.c
@@ -166,9 +166,18 @@ static int benchmark_event_kthread(void *arg)
*/
int trace_benchmark_reg(void)
{
+ if (system_state != SYSTEM_RUNNING) {
+ 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;
}

@@ -183,6 +192,7 @@ void trace_benchmark_unreg(void)
return;

kthread_stop(bm_event_thread);
+ bm_event_thread = NULL;

strcpy(bm_str, "START");
bm_total = 0;
--
2.10.2