Commit b304d0441a4118fadd4c3f16e4dc600c271030b5

Authored by Steven Rostedt
Committed by Steven Rostedt
1 parent 2bd16212b8

tracing: Do not trace in irq when funcgraph-irq option is zero

When the function graph tracer funcgraph-irq option is zero, disable
tracing in IRQs. This makes the option have two effects.

1) When reading the trace file, do not display the functions that
   happen in interrupt context (when detected)

2) [*new*] When recording a trace, skip those that are detected
   to be in interrupt by the 'in_irq()' function

Note, in_irq() is updated at irq_enter() and irq_exit(). There are
still functions that are recorded by the function graph tracer that
is in interrupt context but outside the irq_enter/exit() routines.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

Showing 1 changed file with 22 additions and 1 deletions Side-by-side Diff

kernel/trace/trace_functions_graph.c
... ... @@ -15,6 +15,9 @@
15 15 #include "trace.h"
16 16 #include "trace_output.h"
17 17  
  18 +/* When set, irq functions will be ignored */
  19 +static int ftrace_graph_skip_irqs;
  20 +
18 21 struct fgraph_cpu_data {
19 22 pid_t last_pid;
20 23 int depth;
... ... @@ -208,6 +211,14 @@
208 211 return 1;
209 212 }
210 213  
  214 +static inline int ftrace_graph_ignore_irqs(void)
  215 +{
  216 + if (!ftrace_graph_skip_irqs)
  217 + return 0;
  218 +
  219 + return in_irq();
  220 +}
  221 +
211 222 int trace_graph_entry(struct ftrace_graph_ent *trace)
212 223 {
213 224 struct trace_array *tr = graph_array;
... ... @@ -222,7 +233,8 @@
222 233 return 0;
223 234  
224 235 /* trace it when it is-nested-in or is a function enabled. */
225   - if (!(trace->depth || ftrace_graph_addr(trace->func)))
  236 + if (!(trace->depth || ftrace_graph_addr(trace->func)) ||
  237 + ftrace_graph_ignore_irqs())
226 238 return 0;
227 239  
228 240 local_irq_save(flags);
... ... @@ -1334,6 +1346,14 @@
1334 1346 }
1335 1347 }
1336 1348  
  1349 +static int func_graph_set_flag(u32 old_flags, u32 bit, int set)
  1350 +{
  1351 + if (bit == TRACE_GRAPH_PRINT_IRQS)
  1352 + ftrace_graph_skip_irqs = !set;
  1353 +
  1354 + return 0;
  1355 +}
  1356 +
1337 1357 static struct trace_event_functions graph_functions = {
1338 1358 .trace = print_graph_function_event,
1339 1359 };
... ... @@ -1360,6 +1380,7 @@
1360 1380 .print_line = print_graph_function,
1361 1381 .print_header = print_graph_headers,
1362 1382 .flags = &tracer_flags,
  1383 + .set_flag = func_graph_set_flag,
1363 1384 #ifdef CONFIG_FTRACE_SELFTEST
1364 1385 .selftest = trace_selftest_startup_function_graph,
1365 1386 #endif