diff options
Diffstat (limited to 'kernel/trace/trace_functions_graph.c')
-rw-r--r-- | kernel/trace/trace_functions_graph.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index 8674750a5ece..02c708ae0d42 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c | |||
@@ -15,6 +15,9 @@ | |||
15 | #include "trace.h" | 15 | #include "trace.h" |
16 | #include "trace_output.h" | 16 | #include "trace_output.h" |
17 | 17 | ||
18 | /* When set, irq functions will be ignored */ | ||
19 | static int ftrace_graph_skip_irqs; | ||
20 | |||
18 | struct fgraph_cpu_data { | 21 | struct fgraph_cpu_data { |
19 | pid_t last_pid; | 22 | pid_t last_pid; |
20 | int depth; | 23 | int depth; |
@@ -208,6 +211,14 @@ int __trace_graph_entry(struct trace_array *tr, | |||
208 | return 1; | 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 | int trace_graph_entry(struct ftrace_graph_ent *trace) | 222 | int trace_graph_entry(struct ftrace_graph_ent *trace) |
212 | { | 223 | { |
213 | struct trace_array *tr = graph_array; | 224 | struct trace_array *tr = graph_array; |
@@ -222,7 +233,8 @@ int trace_graph_entry(struct ftrace_graph_ent *trace) | |||
222 | return 0; | 233 | return 0; |
223 | 234 | ||
224 | /* trace it when it is-nested-in or is a function enabled. */ | 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 | return 0; | 238 | return 0; |
227 | 239 | ||
228 | local_irq_save(flags); | 240 | local_irq_save(flags); |
@@ -1334,6 +1346,14 @@ void graph_trace_close(struct trace_iterator *iter) | |||
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 | static struct trace_event_functions graph_functions = { | 1357 | static struct trace_event_functions graph_functions = { |
1338 | .trace = print_graph_function_event, | 1358 | .trace = print_graph_function_event, |
1339 | }; | 1359 | }; |
@@ -1360,6 +1380,7 @@ static struct tracer graph_trace __read_mostly = { | |||
1360 | .print_line = print_graph_function, | 1380 | .print_line = print_graph_function, |
1361 | .print_header = print_graph_headers, | 1381 | .print_header = print_graph_headers, |
1362 | .flags = &tracer_flags, | 1382 | .flags = &tracer_flags, |
1383 | .set_flag = func_graph_set_flag, | ||
1363 | #ifdef CONFIG_FTRACE_SELFTEST | 1384 | #ifdef CONFIG_FTRACE_SELFTEST |
1364 | .selftest = trace_selftest_startup_function_graph, | 1385 | .selftest = trace_selftest_startup_function_graph, |
1365 | #endif | 1386 | #endif |