tracing: Do not start benchmark on boot up
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>
Mon, 28 Nov 2016 18:17:25 +0000 (13:17 -0500)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 9 Dec 2016 14:14:00 +0000 (09:14 -0500)
Trace events are enabled very 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 because it creates a new thread before the init thread is created,
this crashes the kernel.

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 cannot be created.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/trace_benchmark.c

index f76d0416dd839a7b0d9f5f0ccb780c5c8cdc0b4e..2bc7dc3e8ff8db788bfa19e49f88604859a49460 100644 (file)
@@ -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;