ftrace: fix boot trace sched startup
[firefly-linux-kernel-4.4.55.git] / kernel / trace / trace_boot.c
index d0a5e50eeff26d17405ffa4cb62cbde710f9de05..662cb9198906e2684b05742327355ff56fda3268 100644 (file)
 #include "trace.h"
 
 static struct trace_array *boot_trace;
-static int trace_boot_enabled;
+static bool pre_initcalls_finished;
 
-
-/* Should be started after do_pre_smp_initcalls() in init/main.c */
+/* Tells the boot tracer that the pre_smp_initcalls are finished.
+ * So we are ready .
+ * It doesn't enable sched events tracing however.
+ * You have to call enable_boot_trace to do so.
+ */
 void start_boot_trace(void)
 {
-       trace_boot_enabled = 1;
+       pre_initcalls_finished = true;
 }
 
-void stop_boot_trace(void)
+void enable_boot_trace(void)
 {
-       trace_boot_enabled = 0;
+       if (pre_initcalls_finished)
+               tracing_start_cmdline_record();
 }
 
-void reset_boot_trace(struct trace_array *tr)
+void disable_boot_trace(void)
 {
-       stop_boot_trace();
+       if (pre_initcalls_finished)
+               tracing_stop_cmdline_record();
+}
+
+static void reset_boot_trace(struct trace_array *tr)
+{
+       int cpu;
+
+       tr->time_start = ftrace_now(tr->cpu);
+
+       for_each_online_cpu(cpu)
+               tracing_reset(tr, cpu);
 }
 
 static void boot_trace_init(struct trace_array *tr)
@@ -37,18 +52,18 @@ static void boot_trace_init(struct trace_array *tr)
        int cpu;
        boot_trace = tr;
 
-       trace_boot_enabled = 0;
-
        for_each_cpu_mask(cpu, cpu_possible_map)
                tracing_reset(tr, cpu);
+
+       tracing_cmdline_assign_trace(tr);
 }
 
 static void boot_trace_ctrl_update(struct trace_array *tr)
 {
        if (tr->ctrl)
-               start_boot_trace();
+               enable_boot_trace();
        else
-               stop_boot_trace();
+               disable_boot_trace();
 }
 
 static enum print_line_t initcall_print_line(struct trace_iterator *iter)
@@ -99,7 +114,7 @@ void trace_boot(struct boot_trace *it, initcall_t fn)
        unsigned long irq_flags;
        struct trace_array *tr = boot_trace;
 
-       if (!trace_boot_enabled)
+       if (!pre_initcalls_finished)
                return;
 
        /* Get its name now since this function could