Commit b304d0441a4118fadd4c3f16e4dc600c271030b5
Committed by
Steven Rostedt
1 parent
2bd16212b8
Exists in
master
and in
7 other branches
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 |