Merge remote-tracking branches 'spi/fix/dspi' and 'spi/fix/spidev' into spi-linus
[firefly-linux-kernel-4.4.55.git] / kernel / trace / trace_irqsoff.c
index bd9cd0e2c13cd0b735c91126b5dfd7a7dcd497af..e4e56589ec1d392c1734ddff45e87b6fc2dde2fb 100644 (file)
@@ -31,7 +31,6 @@ enum {
 static int trace_type __read_mostly;
 
 static int save_flags;
-static bool function_enabled;
 
 static void stop_irqsoff_tracer(struct trace_array *tr, int graph);
 static int start_irqsoff_tracer(struct trace_array *tr, int graph);
@@ -59,13 +58,13 @@ irq_trace(void)
 
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 static int irqsoff_display_graph(struct trace_array *tr, int set);
-# define is_graph() (trace_flags & TRACE_ITER_DISPLAY_GRAPH)
+# define is_graph(tr) ((tr)->trace_flags & TRACE_ITER_DISPLAY_GRAPH)
 #else
 static inline int irqsoff_display_graph(struct trace_array *tr, int set)
 {
        return -EINVAL;
 }
-# define is_graph() false
+# define is_graph(tr) false
 #endif
 
 /*
@@ -150,7 +149,7 @@ static int irqsoff_display_graph(struct trace_array *tr, int set)
 {
        int cpu;
 
-       if (!(is_graph() ^ set))
+       if (!(is_graph(tr) ^ set))
                return 0;
 
        stop_irqsoff_tracer(irqsoff_trace, !set);
@@ -199,7 +198,7 @@ static void irqsoff_graph_return(struct ftrace_graph_ret *trace)
 
 static void irqsoff_trace_open(struct trace_iterator *iter)
 {
-       if (is_graph())
+       if (is_graph(iter->tr))
                graph_trace_open(iter);
 
 }
@@ -221,7 +220,7 @@ static enum print_line_t irqsoff_print_line(struct trace_iterator *iter)
         * In graph mode call the graph tracer output function,
         * otherwise go with the TRACE_FN event handler
         */
-       if (is_graph())
+       if (is_graph(iter->tr))
                return print_graph_function_flags(iter, GRAPH_TRACER_FLAGS);
 
        return TRACE_TYPE_UNHANDLED;
@@ -229,7 +228,9 @@ static enum print_line_t irqsoff_print_line(struct trace_iterator *iter)
 
 static void irqsoff_print_header(struct seq_file *s)
 {
-       if (is_graph())
+       struct trace_array *tr = irqsoff_trace;
+
+       if (is_graph(tr))
                print_graph_headers_flags(s, GRAPH_TRACER_FLAGS);
        else
                trace_default_header(s);
@@ -240,7 +241,7 @@ __trace_function(struct trace_array *tr,
                 unsigned long ip, unsigned long parent_ip,
                 unsigned long flags, int pc)
 {
-       if (is_graph())
+       if (is_graph(tr))
                trace_graph_function(tr, ip, parent_ip, flags, pc);
        else
                trace_function(tr, ip, parent_ip, flags, pc);
@@ -249,21 +250,23 @@ __trace_function(struct trace_array *tr,
 #else
 #define __trace_function trace_function
 
+#ifdef CONFIG_FUNCTION_TRACER
 static int irqsoff_graph_entry(struct ftrace_graph_ent *trace)
 {
        return -1;
 }
+#endif
 
 static enum print_line_t irqsoff_print_line(struct trace_iterator *iter)
 {
        return TRACE_TYPE_UNHANDLED;
 }
 
-static void irqsoff_graph_return(struct ftrace_graph_ret *trace) { }
 static void irqsoff_trace_open(struct trace_iterator *iter) { }
 static void irqsoff_trace_close(struct trace_iterator *iter) { }
 
 #ifdef CONFIG_FUNCTION_TRACER
+static void irqsoff_graph_return(struct ftrace_graph_ret *trace) { }
 static void irqsoff_print_header(struct seq_file *s)
 {
        trace_default_header(s);
@@ -279,16 +282,16 @@ static void irqsoff_print_header(struct seq_file *s)
 /*
  * Should this new latency be reported/recorded?
  */
-static int report_latency(struct trace_array *tr, cycle_t delta)
+static bool report_latency(struct trace_array *tr, cycle_t delta)
 {
        if (tracing_thresh) {
                if (delta < tracing_thresh)
-                       return 0;
+                       return false;
        } else {
                if (delta <= tr->max_latency)
-                       return 0;
+                       return false;
        }
-       return 1;
+       return true;
 }
 
 static void
@@ -507,12 +510,15 @@ void trace_preempt_off(unsigned long a0, unsigned long a1)
 }
 #endif /* CONFIG_PREEMPT_TRACER */
 
+#ifdef CONFIG_FUNCTION_TRACER
+static bool function_enabled;
+
 static int register_irqsoff_function(struct trace_array *tr, int graph, int set)
 {
        int ret;
 
        /* 'set' is set if TRACE_ITER_FUNCTION is about to be set */
-       if (function_enabled || (!set && !(trace_flags & TRACE_ITER_FUNCTION)))
+       if (function_enabled || (!set && !(tr->trace_flags & TRACE_ITER_FUNCTION)))
                return 0;
 
        if (graph)
@@ -540,21 +546,35 @@ static void unregister_irqsoff_function(struct trace_array *tr, int graph)
        function_enabled = false;
 }
 
-static int irqsoff_function_set(struct trace_array *tr, int set)
+static int irqsoff_function_set(struct trace_array *tr, u32 mask, int set)
 {
+       if (!(mask & TRACE_ITER_FUNCTION))
+               return 0;
+
        if (set)
-               register_irqsoff_function(tr, is_graph(), 1);
+               register_irqsoff_function(tr, is_graph(tr), 1);
        else
-               unregister_irqsoff_function(tr, is_graph());
+               unregister_irqsoff_function(tr, is_graph(tr));
+       return 1;
+}
+#else
+static int register_irqsoff_function(struct trace_array *tr, int graph, int set)
+{
        return 0;
 }
+static void unregister_irqsoff_function(struct trace_array *tr, int graph) { }
+static inline int irqsoff_function_set(struct trace_array *tr, u32 mask, int set)
+{
+       return 0;
+}
+#endif /* CONFIG_FUNCTION_TRACER */
 
 static int irqsoff_flag_changed(struct trace_array *tr, u32 mask, int set)
 {
        struct tracer *tracer = tr->current_trace;
 
-       if (mask & TRACE_ITER_FUNCTION)
-               return irqsoff_function_set(tr, set);
+       if (irqsoff_function_set(tr, mask, set))
+               return 0;
 
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
        if (mask & TRACE_ITER_DISPLAY_GRAPH)
@@ -592,7 +612,7 @@ static int __irqsoff_tracer_init(struct trace_array *tr)
        if (irqsoff_busy)
                return -EBUSY;
 
-       save_flags = trace_flags;
+       save_flags = tr->trace_flags;
 
        /* non overwrite screws up the latency tracers */
        set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1);
@@ -608,7 +628,7 @@ static int __irqsoff_tracer_init(struct trace_array *tr)
 
        /* Only toplevel instance supports graph tracing */
        if (start_irqsoff_tracer(tr, (tr->flags & TRACE_ARRAY_FL_GLOBAL &&
-                                     is_graph())))
+                                     is_graph(tr))))
                printk(KERN_ERR "failed to start irqsoff tracer\n");
 
        irqsoff_busy = true;
@@ -620,7 +640,7 @@ static void irqsoff_tracer_reset(struct trace_array *tr)
        int lat_flag = save_flags & TRACE_ITER_LATENCY_FMT;
        int overwrite_flag = save_flags & TRACE_ITER_OVERWRITE;
 
-       stop_irqsoff_tracer(tr, is_graph());
+       stop_irqsoff_tracer(tr, is_graph(tr));
 
        set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, lat_flag);
        set_tracer_flag(tr, TRACE_ITER_OVERWRITE, overwrite_flag);