aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/trace_functions_graph.c50
1 files changed, 29 insertions, 21 deletions
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
index 6c7738e4f98b..8f4004a00b4e 100644
--- a/kernel/trace/trace_functions_graph.c
+++ b/kernel/trace/trace_functions_graph.c
@@ -351,16 +351,35 @@ print_graph_overhead(unsigned long long duration, struct trace_seq *s)
351 return trace_seq_printf(s, " "); 351 return trace_seq_printf(s, " ");
352} 352}
353 353
354static int print_graph_abs_time(u64 t, struct trace_seq *s)
355{
356 unsigned long usecs_rem;
357
358 usecs_rem = do_div(t, NSEC_PER_SEC);
359 usecs_rem /= 1000;
360
361 return trace_seq_printf(s, "%5lu.%06lu | ",
362 (unsigned long)t, usecs_rem);
363}
364
354static enum print_line_t 365static enum print_line_t
355print_graph_irq(struct trace_seq *s, unsigned long addr, 366print_graph_irq(struct trace_iterator *iter, unsigned long addr,
356 enum trace_type type, int cpu, pid_t pid) 367 enum trace_type type, int cpu, pid_t pid)
357{ 368{
358 int ret; 369 int ret;
370 struct trace_seq *s = &iter->seq;
359 371
360 if (addr < (unsigned long)__irqentry_text_start || 372 if (addr < (unsigned long)__irqentry_text_start ||
361 addr >= (unsigned long)__irqentry_text_end) 373 addr >= (unsigned long)__irqentry_text_end)
362 return TRACE_TYPE_UNHANDLED; 374 return TRACE_TYPE_UNHANDLED;
363 375
376 /* Absolute time */
377 if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME) {
378 ret = print_graph_abs_time(iter->ts, s);
379 if (!ret)
380 return TRACE_TYPE_PARTIAL_LINE;
381 }
382
364 /* Cpu */ 383 /* Cpu */
365 if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) { 384 if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) {
366 ret = print_graph_cpu(s, cpu); 385 ret = print_graph_cpu(s, cpu);
@@ -446,17 +465,6 @@ print_graph_duration(unsigned long long duration, struct trace_seq *s)
446 465
447} 466}
448 467
449static int print_graph_abs_time(u64 t, struct trace_seq *s)
450{
451 unsigned long usecs_rem;
452
453 usecs_rem = do_div(t, 1000000000);
454 usecs_rem /= 1000;
455
456 return trace_seq_printf(s, "%5lu.%06lu | ",
457 (unsigned long)t, usecs_rem);
458}
459
460/* Case of a leaf function on its call entry */ 468/* Case of a leaf function on its call entry */
461static enum print_line_t 469static enum print_line_t
462print_graph_entry_leaf(struct trace_iterator *iter, 470print_graph_entry_leaf(struct trace_iterator *iter,
@@ -561,7 +569,7 @@ print_graph_entry(struct ftrace_graph_ent_entry *field, struct trace_seq *s,
561 return TRACE_TYPE_PARTIAL_LINE; 569 return TRACE_TYPE_PARTIAL_LINE;
562 570
563 /* Interrupt */ 571 /* Interrupt */
564 ret = print_graph_irq(s, call->func, TRACE_GRAPH_ENT, cpu, ent->pid); 572 ret = print_graph_irq(iter, call->func, TRACE_GRAPH_ENT, cpu, ent->pid);
565 if (ret == TRACE_TYPE_PARTIAL_LINE) 573 if (ret == TRACE_TYPE_PARTIAL_LINE)
566 return TRACE_TYPE_PARTIAL_LINE; 574 return TRACE_TYPE_PARTIAL_LINE;
567 575
@@ -581,7 +589,7 @@ print_graph_entry(struct ftrace_graph_ent_entry *field, struct trace_seq *s,
581 589
582 /* Proc */ 590 /* Proc */
583 if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) { 591 if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) {
584 ret = print_graph_proc(s, ent->pid); 592 ret = print_graph_proc(s, pid);
585 if (ret == TRACE_TYPE_PARTIAL_LINE) 593 if (ret == TRACE_TYPE_PARTIAL_LINE)
586 return TRACE_TYPE_PARTIAL_LINE; 594 return TRACE_TYPE_PARTIAL_LINE;
587 595
@@ -605,11 +613,11 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s,
605 int i; 613 int i;
606 int ret; 614 int ret;
607 int cpu = iter->cpu; 615 int cpu = iter->cpu;
608 pid_t *last_pid = iter->private; 616 pid_t *last_pid = iter->private, pid = ent->pid;
609 unsigned long long duration = trace->rettime - trace->calltime; 617 unsigned long long duration = trace->rettime - trace->calltime;
610 618
611 /* Pid */ 619 /* Pid */
612 if (verif_pid(s, ent->pid, cpu, last_pid) == TRACE_TYPE_PARTIAL_LINE) 620 if (verif_pid(s, pid, cpu, last_pid) == TRACE_TYPE_PARTIAL_LINE)
613 return TRACE_TYPE_PARTIAL_LINE; 621 return TRACE_TYPE_PARTIAL_LINE;
614 622
615 /* Absolute time */ 623 /* Absolute time */
@@ -668,7 +676,7 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s,
668 return TRACE_TYPE_PARTIAL_LINE; 676 return TRACE_TYPE_PARTIAL_LINE;
669 } 677 }
670 678
671 ret = print_graph_irq(s, trace->func, TRACE_GRAPH_RET, cpu, ent->pid); 679 ret = print_graph_irq(iter, trace->func, TRACE_GRAPH_RET, cpu, pid);
672 if (ret == TRACE_TYPE_PARTIAL_LINE) 680 if (ret == TRACE_TYPE_PARTIAL_LINE)
673 return TRACE_TYPE_PARTIAL_LINE; 681 return TRACE_TYPE_PARTIAL_LINE;
674 682
@@ -684,6 +692,10 @@ print_graph_comment(struct print_entry *trace, struct trace_seq *s,
684 int cpu = iter->cpu; 692 int cpu = iter->cpu;
685 pid_t *last_pid = iter->private; 693 pid_t *last_pid = iter->private;
686 694
695 /* Pid */
696 if (verif_pid(s, ent->pid, cpu, last_pid) == TRACE_TYPE_PARTIAL_LINE)
697 return TRACE_TYPE_PARTIAL_LINE;
698
687 /* Absolute time */ 699 /* Absolute time */
688 if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME) { 700 if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME) {
689 ret = print_graph_abs_time(iter->ts, s); 701 ret = print_graph_abs_time(iter->ts, s);
@@ -691,10 +703,6 @@ print_graph_comment(struct print_entry *trace, struct trace_seq *s,
691 return TRACE_TYPE_PARTIAL_LINE; 703 return TRACE_TYPE_PARTIAL_LINE;
692 } 704 }
693 705
694 /* Pid */
695 if (verif_pid(s, ent->pid, cpu, last_pid) == TRACE_TYPE_PARTIAL_LINE)
696 return TRACE_TYPE_PARTIAL_LINE;
697
698 /* Cpu */ 706 /* Cpu */
699 if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) { 707 if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) {
700 ret = print_graph_cpu(s, cpu); 708 ret = print_graph_cpu(s, cpu);