These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / kernel / trace / trace_irqsoff.c
index d0e1d0e..069942c 100644 (file)
@@ -32,7 +32,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);
@@ -58,22 +57,16 @@ irq_trace(void)
 # define irq_trace() (0)
 #endif
 
-#define TRACE_DISPLAY_GRAPH    1
-
-static struct tracer_opt trace_opts[] = {
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
-       /* display latency trace as call graph */
-       { TRACER_OPT(display-graph, TRACE_DISPLAY_GRAPH) },
+static int irqsoff_display_graph(struct trace_array *tr, int set);
+# 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(tr) false
 #endif
-       { } /* Empty entry */
-};
-
-static struct tracer_flags tracer_flags = {
-       .val  = 0,
-       .opts = trace_opts,
-};
-
-#define is_graph() (tracer_flags.val & TRACE_DISPLAY_GRAPH)
 
 /*
  * Sequence count - we record it when starting a measurement and
@@ -153,15 +146,11 @@ irqsoff_tracer_call(unsigned long ip, unsigned long parent_ip,
 #endif /* CONFIG_FUNCTION_TRACER */
 
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
-static int
-irqsoff_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set)
+static int irqsoff_display_graph(struct trace_array *tr, int set)
 {
        int cpu;
 
-       if (!(bit & TRACE_DISPLAY_GRAPH))
-               return -EINVAL;
-
-       if (!(is_graph() ^ set))
+       if (!(is_graph(tr) ^ set))
                return 0;
 
        stop_irqsoff_tracer(irqsoff_trace, !set);
@@ -210,7 +199,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);
 
 }
@@ -232,7 +221,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;
@@ -240,7 +229,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);
@@ -251,7 +242,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);
@@ -260,27 +251,23 @@ __trace_function(struct trace_array *tr,
 #else
 #define __trace_function trace_function
 
-static int
-irqsoff_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set)
-{
-       return -EINVAL;
-}
-
+#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);
@@ -296,16 +283,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
@@ -434,13 +421,13 @@ void start_critical_timings(void)
 {
        if (preempt_trace() || irq_trace())
                start_critical_timing(CALLER_ADDR0, CALLER_ADDR1);
-       trace_preemptirqsoff_hist(TRACE_START, 1);
+       trace_preemptirqsoff_hist_rcuidle(TRACE_START, 1);
 }
 EXPORT_SYMBOL_GPL(start_critical_timings);
 
 void stop_critical_timings(void)
 {
-       trace_preemptirqsoff_hist(TRACE_STOP, 0);
+       trace_preemptirqsoff_hist_rcuidle(TRACE_STOP, 0);
        if (preempt_trace() || irq_trace())
                stop_critical_timing(CALLER_ADDR0, CALLER_ADDR1);
 }
@@ -534,12 +521,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)
@@ -567,20 +557,40 @@ static void unregister_irqsoff_function(struct trace_array *tr, int graph)
        function_enabled = false;
 }
 
-static void 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)
-               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)
+               return irqsoff_display_graph(tr, set);
+#endif
 
        return trace_keep_overwrite(tracer, mask, set);
 }
@@ -613,7 +623,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);
@@ -629,7 +639,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;
@@ -641,7 +651,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);
@@ -677,8 +687,6 @@ static struct tracer irqsoff_tracer __read_mostly =
        .print_max      = true,
        .print_header   = irqsoff_print_header,
        .print_line     = irqsoff_print_line,
-       .flags          = &tracer_flags,
-       .set_flag       = irqsoff_set_flag,
        .flag_changed   = irqsoff_flag_changed,
 #ifdef CONFIG_FTRACE_SELFTEST
        .selftest    = trace_selftest_startup_irqsoff,
@@ -711,8 +719,6 @@ static struct tracer preemptoff_tracer __read_mostly =
        .print_max      = true,
        .print_header   = irqsoff_print_header,
        .print_line     = irqsoff_print_line,
-       .flags          = &tracer_flags,
-       .set_flag       = irqsoff_set_flag,
        .flag_changed   = irqsoff_flag_changed,
 #ifdef CONFIG_FTRACE_SELFTEST
        .selftest    = trace_selftest_startup_preemptoff,
@@ -747,8 +753,6 @@ static struct tracer preemptirqsoff_tracer __read_mostly =
        .print_max      = true,
        .print_header   = irqsoff_print_header,
        .print_line     = irqsoff_print_line,
-       .flags          = &tracer_flags,
-       .set_flag       = irqsoff_set_flag,
        .flag_changed   = irqsoff_flag_changed,
 #ifdef CONFIG_FTRACE_SELFTEST
        .selftest    = trace_selftest_startup_preemptirqsoff,