Merge tag 'efi-urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/mfleming...
[firefly-linux-kernel-4.4.55.git] / kernel / trace / trace_sched_wakeup.c
index e14da5e97a69d86611d236488ce5669a28c64be5..19bd8928ce944da6232c1f63708d723a2563020f 100644 (file)
@@ -130,15 +130,9 @@ wakeup_tracer_call(unsigned long ip, unsigned long parent_ip,
        atomic_dec(&data->disabled);
        preempt_enable_notrace();
 }
-
-static struct ftrace_ops trace_ops __read_mostly =
-{
-       .func = wakeup_tracer_call,
-       .flags = FTRACE_OPS_FL_GLOBAL | FTRACE_OPS_FL_RECURSION_SAFE,
-};
 #endif /* CONFIG_FUNCTION_TRACER */
 
-static int register_wakeup_function(int graph, int set)
+static int register_wakeup_function(struct trace_array *tr, int graph, int set)
 {
        int ret;
 
@@ -150,7 +144,7 @@ static int register_wakeup_function(int graph, int set)
                ret = register_ftrace_graph(&wakeup_graph_return,
                                            &wakeup_graph_entry);
        else
-               ret = register_ftrace_function(&trace_ops);
+               ret = register_ftrace_function(tr->ops);
 
        if (!ret)
                function_enabled = true;
@@ -158,7 +152,7 @@ static int register_wakeup_function(int graph, int set)
        return ret;
 }
 
-static void unregister_wakeup_function(int graph)
+static void unregister_wakeup_function(struct trace_array *tr, int graph)
 {
        if (!function_enabled)
                return;
@@ -166,17 +160,17 @@ static void unregister_wakeup_function(int graph)
        if (graph)
                unregister_ftrace_graph();
        else
-               unregister_ftrace_function(&trace_ops);
+               unregister_ftrace_function(tr->ops);
 
        function_enabled = false;
 }
 
-static void wakeup_function_set(int set)
+static void wakeup_function_set(struct trace_array *tr, int set)
 {
        if (set)
-               register_wakeup_function(is_graph(), 1);
+               register_wakeup_function(tr, is_graph(), 1);
        else
-               unregister_wakeup_function(is_graph());
+               unregister_wakeup_function(tr, is_graph());
 }
 
 static int wakeup_flag_changed(struct trace_array *tr, u32 mask, int set)
@@ -184,16 +178,16 @@ static int wakeup_flag_changed(struct trace_array *tr, u32 mask, int set)
        struct tracer *tracer = tr->current_trace;
 
        if (mask & TRACE_ITER_FUNCTION)
-               wakeup_function_set(set);
+               wakeup_function_set(tr, set);
 
        return trace_keep_overwrite(tracer, mask, set);
 }
 
-static int start_func_tracer(int graph)
+static int start_func_tracer(struct trace_array *tr, int graph)
 {
        int ret;
 
-       ret = register_wakeup_function(graph, 0);
+       ret = register_wakeup_function(tr, graph, 0);
 
        if (!ret && tracing_is_enabled())
                tracer_enabled = 1;
@@ -203,11 +197,11 @@ static int start_func_tracer(int graph)
        return ret;
 }
 
-static void stop_func_tracer(int graph)
+static void stop_func_tracer(struct trace_array *tr, int graph)
 {
        tracer_enabled = 0;
 
-       unregister_wakeup_function(graph);
+       unregister_wakeup_function(tr, graph);
 }
 
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
@@ -221,12 +215,12 @@ wakeup_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set)
        if (!(is_graph() ^ set))
                return 0;
 
-       stop_func_tracer(!set);
+       stop_func_tracer(tr, !set);
 
        wakeup_reset(wakeup_trace);
-       tracing_max_latency = 0;
+       tr->max_latency = 0;
 
-       return start_func_tracer(set);
+       return start_func_tracer(tr, set);
 }
 
 static int wakeup_graph_entry(struct ftrace_graph_ent *trace)
@@ -350,13 +344,13 @@ static void wakeup_print_header(struct seq_file *s)
 /*
  * Should this new latency be reported/recorded?
  */
-static int report_latency(cycle_t delta)
+static int report_latency(struct trace_array *tr, cycle_t delta)
 {
        if (tracing_thresh) {
                if (delta < tracing_thresh)
                        return 0;
        } else {
-               if (delta <= tracing_max_latency)
+               if (delta <= tr->max_latency)
                        return 0;
        }
        return 1;
@@ -424,11 +418,11 @@ probe_wakeup_sched_switch(void *ignore,
        T1 = ftrace_now(cpu);
        delta = T1-T0;
 
-       if (!report_latency(delta))
+       if (!report_latency(wakeup_trace, delta))
                goto out_unlock;
 
        if (likely(!is_tracing_stopped())) {
-               tracing_max_latency = delta;
+               wakeup_trace->max_latency = delta;
                update_max_tr(wakeup_trace, wakeup_task, wakeup_cpu);
        }
 
@@ -587,7 +581,7 @@ static void start_wakeup_tracer(struct trace_array *tr)
         */
        smp_wmb();
 
-       if (start_func_tracer(is_graph()))
+       if (start_func_tracer(tr, is_graph()))
                printk(KERN_ERR "failed to start wakeup tracer\n");
 
        return;
@@ -600,13 +594,15 @@ fail_deprobe:
 static void stop_wakeup_tracer(struct trace_array *tr)
 {
        tracer_enabled = 0;
-       stop_func_tracer(is_graph());
+       stop_func_tracer(tr, is_graph());
        unregister_trace_sched_switch(probe_wakeup_sched_switch, NULL);
        unregister_trace_sched_wakeup_new(probe_wakeup, NULL);
        unregister_trace_sched_wakeup(probe_wakeup, NULL);
        unregister_trace_sched_migrate_task(probe_wakeup_migrate_task, NULL);
 }
 
+static bool wakeup_busy;
+
 static int __wakeup_tracer_init(struct trace_array *tr)
 {
        save_flags = trace_flags;
@@ -615,14 +611,20 @@ static int __wakeup_tracer_init(struct trace_array *tr)
        set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1);
        set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, 1);
 
-       tracing_max_latency = 0;
+       tr->max_latency = 0;
        wakeup_trace = tr;
+       ftrace_init_array_ops(tr, wakeup_tracer_call);
        start_wakeup_tracer(tr);
+
+       wakeup_busy = true;
        return 0;
 }
 
 static int wakeup_tracer_init(struct trace_array *tr)
 {
+       if (wakeup_busy)
+               return -EBUSY;
+
        wakeup_dl = 0;
        wakeup_rt = 0;
        return __wakeup_tracer_init(tr);
@@ -630,6 +632,9 @@ static int wakeup_tracer_init(struct trace_array *tr)
 
 static int wakeup_rt_tracer_init(struct trace_array *tr)
 {
+       if (wakeup_busy)
+               return -EBUSY;
+
        wakeup_dl = 0;
        wakeup_rt = 1;
        return __wakeup_tracer_init(tr);
@@ -637,6 +642,9 @@ static int wakeup_rt_tracer_init(struct trace_array *tr)
 
 static int wakeup_dl_tracer_init(struct trace_array *tr)
 {
+       if (wakeup_busy)
+               return -EBUSY;
+
        wakeup_dl = 1;
        wakeup_rt = 0;
        return __wakeup_tracer_init(tr);
@@ -653,6 +661,8 @@ static void wakeup_tracer_reset(struct trace_array *tr)
 
        set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, lat_flag);
        set_tracer_flag(tr, TRACE_ITER_OVERWRITE, overwrite_flag);
+       ftrace_reset_array_ops(tr);
+       wakeup_busy = false;
 }
 
 static void wakeup_tracer_start(struct trace_array *tr)
@@ -684,6 +694,7 @@ static struct tracer wakeup_tracer __read_mostly =
 #endif
        .open           = wakeup_trace_open,
        .close          = wakeup_trace_close,
+       .allow_instances = true,
        .use_max_tr     = true,
 };
 
@@ -694,7 +705,6 @@ static struct tracer wakeup_rt_tracer __read_mostly =
        .reset          = wakeup_tracer_reset,
        .start          = wakeup_tracer_start,
        .stop           = wakeup_tracer_stop,
-       .wait_pipe      = poll_wait_pipe,
        .print_max      = true,
        .print_header   = wakeup_print_header,
        .print_line     = wakeup_print_line,
@@ -706,6 +716,7 @@ static struct tracer wakeup_rt_tracer __read_mostly =
 #endif
        .open           = wakeup_trace_open,
        .close          = wakeup_trace_close,
+       .allow_instances = true,
        .use_max_tr     = true,
 };
 
@@ -716,7 +727,6 @@ static struct tracer wakeup_dl_tracer __read_mostly =
        .reset          = wakeup_tracer_reset,
        .start          = wakeup_tracer_start,
        .stop           = wakeup_tracer_stop,
-       .wait_pipe      = poll_wait_pipe,
        .print_max      = true,
        .print_header   = wakeup_print_header,
        .print_line     = wakeup_print_line,