aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/trace/ftrace.txt10
-rw-r--r--kernel/trace/trace.h2
-rw-r--r--kernel/trace/trace_functions_graph.c23
-rw-r--r--kernel/trace/trace_output.c34
4 files changed, 41 insertions, 28 deletions
diff --git a/Documentation/trace/ftrace.txt b/Documentation/trace/ftrace.txt
index f10f5f5d260d..8408e040f06f 100644
--- a/Documentation/trace/ftrace.txt
+++ b/Documentation/trace/ftrace.txt
@@ -685,9 +685,11 @@ The above is mostly meaningful for kernel developers.
685 needs to be fixed to be only relative to the same CPU. 685 needs to be fixed to be only relative to the same CPU.
686 The marks are determined by the difference between this 686 The marks are determined by the difference between this
687 current trace and the next trace. 687 current trace and the next trace.
688 '!' - greater than preempt_mark_thresh (default 100) 688 '$' - greater than 1 second
689 '+' - greater than 1 microsecond 689 '#' - greater than 1000 microsecond
690 ' ' - less than or equal to 1 microsecond. 690 '!' - greater than 100 microsecond
691 '+' - greater than 10 microsecond
692 ' ' - less than or equal to 10 microsecond.
691 693
692 The rest is the same as the 'trace' file. 694 The rest is the same as the 'trace' file.
693 695
@@ -1956,6 +1958,8 @@ want, depending on your needs.
1956 1958
1957 + means that the function exceeded 10 usecs. 1959 + means that the function exceeded 10 usecs.
1958 ! means that the function exceeded 100 usecs. 1960 ! means that the function exceeded 100 usecs.
1961 # means that the function exceeded 1000 usecs.
1962 $ means that the function exceeded 1 sec.
1959 1963
1960 1964
1961- The task/pid field displays the thread cmdline and pid which 1965- The task/pid field displays the thread cmdline and pid which
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index c3a37e55ec8b..3255dfb054a0 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -708,6 +708,8 @@ enum print_line_t print_trace_line(struct trace_iterator *iter);
708 708
709extern unsigned long trace_flags; 709extern unsigned long trace_flags;
710 710
711extern char trace_find_mark(unsigned long long duration);
712
711/* Standard output formatting function used for function return traces */ 713/* Standard output formatting function used for function return traces */
712#ifdef CONFIG_FUNCTION_GRAPH_TRACER 714#ifdef CONFIG_FUNCTION_GRAPH_TRACER
713 715
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
index 100288d10e1f..6c2ab955018c 100644
--- a/kernel/trace/trace_functions_graph.c
+++ b/kernel/trace/trace_functions_graph.c
@@ -730,8 +730,6 @@ static void
730print_graph_duration(unsigned long long duration, struct trace_seq *s, 730print_graph_duration(unsigned long long duration, struct trace_seq *s,
731 u32 flags) 731 u32 flags)
732{ 732{
733 bool duration_printed = false;
734
735 if (!(flags & TRACE_GRAPH_PRINT_DURATION) || 733 if (!(flags & TRACE_GRAPH_PRINT_DURATION) ||
736 !(trace_flags & TRACE_ITER_CONTEXT_INFO)) 734 !(trace_flags & TRACE_ITER_CONTEXT_INFO))
737 return; 735 return;
@@ -750,24 +748,9 @@ print_graph_duration(unsigned long long duration, struct trace_seq *s,
750 } 748 }
751 749
752 /* Signal a overhead of time execution to the output */ 750 /* Signal a overhead of time execution to the output */
753 if (flags & TRACE_GRAPH_PRINT_OVERHEAD) { 751 if (flags & TRACE_GRAPH_PRINT_OVERHEAD)
754 /* Duration exceeded 100 usecs */ 752 trace_seq_printf(s, "%c ", trace_find_mark(duration));
755 if (duration > 100000ULL) { 753 else
756 trace_seq_puts(s, "! ");
757 duration_printed = true;
758
759 /* Duration exceeded 10 usecs */
760 } else if (duration > 10000ULL) {
761 trace_seq_puts(s, "+ ");
762 duration_printed = true;
763 }
764 }
765
766 /*
767 * If we did not exceed the duration tresholds or we dont want
768 * to print out the overhead. Either way we need to fill out the space.
769 */
770 if (!duration_printed)
771 trace_seq_puts(s, " "); 754 trace_seq_puts(s, " ");
772 755
773 trace_print_graph_duration(duration, s); 756 trace_print_graph_duration(duration, s);
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c
index 723818bc83b4..b77b9a697619 100644
--- a/kernel/trace/trace_output.c
+++ b/kernel/trace/trace_output.c
@@ -115,7 +115,7 @@ ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val,
115 115
116 if (ret == (const char *)(trace_seq_buffer_ptr(p))) 116 if (ret == (const char *)(trace_seq_buffer_ptr(p)))
117 trace_seq_printf(p, "0x%lx", val); 117 trace_seq_printf(p, "0x%lx", val);
118 118
119 trace_seq_putc(p, 0); 119 trace_seq_putc(p, 0);
120 120
121 return ret; 121 return ret;
@@ -443,7 +443,32 @@ lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu)
443 return trace_print_lat_fmt(s, entry); 443 return trace_print_lat_fmt(s, entry);
444} 444}
445 445
446static unsigned long preempt_mark_thresh_us = 100; 446#undef MARK
447#define MARK(v, s) {.val = v, .sym = s}
448/* trace overhead mark */
449static const struct trace_mark {
450 unsigned long long val; /* unit: nsec */
451 char sym;
452} mark[] = {
453 MARK(1000000000ULL , '$'), /* 1 sec */
454 MARK(1000000ULL , '#'), /* 1000 usecs */
455 MARK(100000ULL , '!'), /* 100 usecs */
456 MARK(10000ULL , '+'), /* 10 usecs */
457};
458#undef MARK
459
460char trace_find_mark(unsigned long long d)
461{
462 int i;
463 int size = ARRAY_SIZE(mark);
464
465 for (i = 0; i < size; i++) {
466 if (d >= mark[i].val)
467 break;
468 }
469
470 return (i == size) ? ' ' : mark[i].sym;
471}
447 472
448static int 473static int
449lat_print_timestamp(struct trace_iterator *iter, u64 next_ts) 474lat_print_timestamp(struct trace_iterator *iter, u64 next_ts)
@@ -480,8 +505,7 @@ lat_print_timestamp(struct trace_iterator *iter, u64 next_ts)
480 trace_seq_printf( 505 trace_seq_printf(
481 s, " %4lldus%c: ", 506 s, " %4lldus%c: ",
482 abs_ts, 507 abs_ts,
483 rel_ts > preempt_mark_thresh_us ? '!' : 508 trace_find_mark(rel_ts * NSEC_PER_USEC));
484 rel_ts > 1 ? '+' : ' ');
485 509
486 } else { /* !verbose && !in_ns */ 510 } else { /* !verbose && !in_ns */
487 trace_seq_printf(s, " %4lld: ", abs_ts); 511 trace_seq_printf(s, " %4lld: ", abs_ts);
@@ -663,7 +687,7 @@ int register_ftrace_event(struct trace_event *event)
663 goto out; 687 goto out;
664 688
665 } else { 689 } else {
666 690
667 event->type = next_event_type++; 691 event->type = next_event_type++;
668 list = &ftrace_event_list; 692 list = &ftrace_event_list;
669 } 693 }