aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace')
-rw-r--r--kernel/trace/trace.h2
-rw-r--r--kernel/trace/trace_functions_graph.c23
-rw-r--r--kernel/trace/trace_output.c34
3 files changed, 34 insertions, 25 deletions
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 }