diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2008-12-09 17:55:25 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-12-12 05:14:09 -0500 |
commit | f8b755ac8e0cc3f330269e4c4504514f987167a2 (patch) | |
tree | c1ac8c36ffdcf19d6aa1da2502c51a12f9576d1a /kernel/trace | |
parent | bcbc4f20b52c2c40c43a4d2337707dcdfe81bc3a (diff) |
tracing/function-graph-tracer: Output arrows signal on hardirq call/return
Impact: make more obvious the hardirq calls in the output
When a hardirq is triggered inside the codeflow on output, we have
now two arrows that indicate the entry and return of the hardirq.
0) | bit_waitqueue() {
0) 0.880 us | __phys_addr();
0) 2.699 us | }
0) | __wake_up_bit() {
0) ==========> | smp_apic_timer_interrupt() {
0) 0.797 us | native_apic_mem_write();
0) 0.715 us | exit_idle();
0) | irq_enter() {
0) 0.722 us | idle_cpu();
0) 5.519 us | }
0) | hrtimer_interrupt() {
0) | ktime_get() {
0) | ktime_get_ts() {
0) 0.805 us | getnstimeofday();
[...]
0) ! 108.528 us | }
0) | irq_exit() {
0) | do_softirq() {
0) | __do_softirq() {
0) 0.895 us | __local_bh_disable();
0) | run_timer_softirq() {
0) 0.827 us | hrtimer_run_pending();
0) 1.226 us | _spin_lock_irq();
0) | _spin_unlock_irq() {
0) 6.550 us | }
0) 0.924 us | _local_bh_enable();
0) + 12.129 us | }
0) + 13.911 us | }
0) 0.707 us | idle_cpu();
0) + 17.009 us | }
0) ! 137.419 us | }
0) <========== |
0) 1.045 us | }
0) ! 148.908 us | }
0) ! 151.022 us | }
0) ! 153.022 us | }
0) 0.963 us | journal_mark_dirty();
0) 0.925 us | __brelse();
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace')
-rw-r--r-- | kernel/trace/trace_functions_graph.c | 66 |
1 files changed, 62 insertions, 4 deletions
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index af60eef4cbcc..4bf39fcae97a 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c | |||
@@ -231,6 +231,49 @@ trace_branch_is_leaf(struct trace_iterator *iter, | |||
231 | return true; | 231 | return true; |
232 | } | 232 | } |
233 | 233 | ||
234 | static enum print_line_t | ||
235 | print_graph_irq(struct trace_seq *s, unsigned long addr, | ||
236 | enum trace_type type, int cpu, pid_t pid) | ||
237 | { | ||
238 | int ret; | ||
239 | |||
240 | if (addr < (unsigned long)__irqentry_text_start || | ||
241 | addr >= (unsigned long)__irqentry_text_end) | ||
242 | return TRACE_TYPE_UNHANDLED; | ||
243 | |||
244 | if (type == TRACE_GRAPH_ENT) { | ||
245 | ret = trace_seq_printf(s, "==========> | "); | ||
246 | } else { | ||
247 | /* Cpu */ | ||
248 | if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) { | ||
249 | ret = print_graph_cpu(s, cpu); | ||
250 | if (ret == TRACE_TYPE_PARTIAL_LINE) | ||
251 | return TRACE_TYPE_PARTIAL_LINE; | ||
252 | } | ||
253 | /* Proc */ | ||
254 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) { | ||
255 | ret = print_graph_proc(s, pid); | ||
256 | if (ret == TRACE_TYPE_PARTIAL_LINE) | ||
257 | return TRACE_TYPE_PARTIAL_LINE; | ||
258 | |||
259 | ret = trace_seq_printf(s, " | "); | ||
260 | if (!ret) | ||
261 | return TRACE_TYPE_PARTIAL_LINE; | ||
262 | } | ||
263 | |||
264 | /* No overhead */ | ||
265 | if (tracer_flags.val & TRACE_GRAPH_PRINT_OVERHEAD) { | ||
266 | ret = trace_seq_printf(s, " "); | ||
267 | if (!ret) | ||
268 | return TRACE_TYPE_PARTIAL_LINE; | ||
269 | } | ||
270 | |||
271 | ret = trace_seq_printf(s, "<========== |\n"); | ||
272 | } | ||
273 | if (!ret) | ||
274 | return TRACE_TYPE_PARTIAL_LINE; | ||
275 | return TRACE_TYPE_HANDLED; | ||
276 | } | ||
234 | 277 | ||
235 | static enum print_line_t | 278 | static enum print_line_t |
236 | print_graph_duration(unsigned long long duration, struct trace_seq *s) | 279 | print_graph_duration(unsigned long long duration, struct trace_seq *s) |
@@ -344,7 +387,7 @@ print_graph_entry_leaf(struct trace_iterator *iter, | |||
344 | 387 | ||
345 | static enum print_line_t | 388 | static enum print_line_t |
346 | print_graph_entry_nested(struct ftrace_graph_ent_entry *entry, | 389 | print_graph_entry_nested(struct ftrace_graph_ent_entry *entry, |
347 | struct trace_seq *s) | 390 | struct trace_seq *s, pid_t pid, int cpu) |
348 | { | 391 | { |
349 | int i; | 392 | int i; |
350 | int ret; | 393 | int ret; |
@@ -357,8 +400,18 @@ print_graph_entry_nested(struct ftrace_graph_ent_entry *entry, | |||
357 | return TRACE_TYPE_PARTIAL_LINE; | 400 | return TRACE_TYPE_PARTIAL_LINE; |
358 | } | 401 | } |
359 | 402 | ||
360 | /* No time */ | 403 | /* Interrupt */ |
361 | ret = trace_seq_printf(s, " | "); | 404 | ret = print_graph_irq(s, call->func, TRACE_GRAPH_ENT, cpu, pid); |
405 | if (ret == TRACE_TYPE_UNHANDLED) { | ||
406 | /* No time */ | ||
407 | ret = trace_seq_printf(s, " | "); | ||
408 | if (!ret) | ||
409 | return TRACE_TYPE_PARTIAL_LINE; | ||
410 | } else { | ||
411 | if (ret == TRACE_TYPE_PARTIAL_LINE) | ||
412 | return TRACE_TYPE_PARTIAL_LINE; | ||
413 | } | ||
414 | |||
362 | 415 | ||
363 | /* Function */ | 416 | /* Function */ |
364 | for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) { | 417 | for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) { |
@@ -410,7 +463,7 @@ print_graph_entry(struct ftrace_graph_ent_entry *field, struct trace_seq *s, | |||
410 | if (trace_branch_is_leaf(iter, field)) | 463 | if (trace_branch_is_leaf(iter, field)) |
411 | return print_graph_entry_leaf(iter, field, s); | 464 | return print_graph_entry_leaf(iter, field, s); |
412 | else | 465 | else |
413 | return print_graph_entry_nested(field, s); | 466 | return print_graph_entry_nested(field, s, iter->ent->pid, cpu); |
414 | 467 | ||
415 | } | 468 | } |
416 | 469 | ||
@@ -474,6 +527,11 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s, | |||
474 | if (!ret) | 527 | if (!ret) |
475 | return TRACE_TYPE_PARTIAL_LINE; | 528 | return TRACE_TYPE_PARTIAL_LINE; |
476 | } | 529 | } |
530 | |||
531 | ret = print_graph_irq(s, trace->func, TRACE_GRAPH_RET, cpu, ent->pid); | ||
532 | if (ret == TRACE_TYPE_PARTIAL_LINE) | ||
533 | return TRACE_TYPE_PARTIAL_LINE; | ||
534 | |||
477 | return TRACE_TYPE_HANDLED; | 535 | return TRACE_TYPE_HANDLED; |
478 | } | 536 | } |
479 | 537 | ||