diff options
author | Jiri Olsa <jolsa@redhat.com> | 2011-06-03 10:58:48 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2011-06-14 22:48:47 -0400 |
commit | ffeb80fc30acbf6bd51cb47a1815f621a9d017dc (patch) | |
tree | 0291039ad5bc7f652d15157616ea2a77b7294638 /kernel/trace/trace_functions_graph.c | |
parent | 321e68b095addc473ca52ced9acfa59be88f76e6 (diff) |
tracing, function_graph: Merge overhead and duration display functions
Functions print_graph_overhead() and print_graph_duration() displays
data for one field - DURATION.
I merged them into single function print_graph_duration(),
and added a way to display the empty parts of the field.
This way the print_graph_irq() function can use this column to display
the IRQ signs if needed and the DURATION field details stays inside
the print_graph_duration() function.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1307113131-10045-3-git-send-email-jolsa@redhat.com
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace/trace_functions_graph.c')
-rw-r--r-- | kernel/trace/trace_functions_graph.c | 148 |
1 files changed, 74 insertions, 74 deletions
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index 352652eb9aae..44b955fd87bf 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c | |||
@@ -74,6 +74,20 @@ static struct tracer_flags tracer_flags = { | |||
74 | 74 | ||
75 | static struct trace_array *graph_array; | 75 | static struct trace_array *graph_array; |
76 | 76 | ||
77 | /* | ||
78 | * DURATION column is being also used to display IRQ signs, | ||
79 | * following values are used by print_graph_irq and others | ||
80 | * to fill in space into DURATION column. | ||
81 | */ | ||
82 | enum { | ||
83 | DURATION_FILL_FULL = -1, | ||
84 | DURATION_FILL_START = -2, | ||
85 | DURATION_FILL_END = -3, | ||
86 | }; | ||
87 | |||
88 | static enum print_line_t | ||
89 | print_graph_duration(unsigned long long duration, struct trace_seq *s, | ||
90 | u32 flags); | ||
77 | 91 | ||
78 | /* Add a function return address to the trace stack on thread info.*/ | 92 | /* Add a function return address to the trace stack on thread info.*/ |
79 | int | 93 | int |
@@ -577,32 +591,6 @@ get_return_for_leaf(struct trace_iterator *iter, | |||
577 | return next; | 591 | return next; |
578 | } | 592 | } |
579 | 593 | ||
580 | /* Signal a overhead of time execution to the output */ | ||
581 | static int | ||
582 | print_graph_overhead(unsigned long long duration, struct trace_seq *s, | ||
583 | u32 flags) | ||
584 | { | ||
585 | /* If duration disappear, we don't need anything */ | ||
586 | if (!(flags & TRACE_GRAPH_PRINT_DURATION)) | ||
587 | return 1; | ||
588 | |||
589 | /* Non nested entry or return */ | ||
590 | if (duration == -1) | ||
591 | return trace_seq_printf(s, " "); | ||
592 | |||
593 | if (flags & TRACE_GRAPH_PRINT_OVERHEAD) { | ||
594 | /* Duration exceeded 100 msecs */ | ||
595 | if (duration > 100000ULL) | ||
596 | return trace_seq_printf(s, "! "); | ||
597 | |||
598 | /* Duration exceeded 10 msecs */ | ||
599 | if (duration > 10000ULL) | ||
600 | return trace_seq_printf(s, "+ "); | ||
601 | } | ||
602 | |||
603 | return trace_seq_printf(s, " "); | ||
604 | } | ||
605 | |||
606 | static int print_graph_abs_time(u64 t, struct trace_seq *s) | 594 | static int print_graph_abs_time(u64 t, struct trace_seq *s) |
607 | { | 595 | { |
608 | unsigned long usecs_rem; | 596 | unsigned long usecs_rem; |
@@ -650,9 +638,9 @@ print_graph_irq(struct trace_iterator *iter, unsigned long addr, | |||
650 | } | 638 | } |
651 | 639 | ||
652 | /* No overhead */ | 640 | /* No overhead */ |
653 | ret = print_graph_overhead(-1, s, flags); | 641 | ret = print_graph_duration(DURATION_FILL_START, s, flags); |
654 | if (!ret) | 642 | if (ret != TRACE_TYPE_HANDLED) |
655 | return TRACE_TYPE_PARTIAL_LINE; | 643 | return ret; |
656 | 644 | ||
657 | if (type == TRACE_GRAPH_ENT) | 645 | if (type == TRACE_GRAPH_ENT) |
658 | ret = trace_seq_printf(s, "==========>"); | 646 | ret = trace_seq_printf(s, "==========>"); |
@@ -662,9 +650,10 @@ print_graph_irq(struct trace_iterator *iter, unsigned long addr, | |||
662 | if (!ret) | 650 | if (!ret) |
663 | return TRACE_TYPE_PARTIAL_LINE; | 651 | return TRACE_TYPE_PARTIAL_LINE; |
664 | 652 | ||
665 | /* Don't close the duration column if haven't one */ | 653 | ret = print_graph_duration(DURATION_FILL_END, s, flags); |
666 | if (flags & TRACE_GRAPH_PRINT_DURATION) | 654 | if (ret != TRACE_TYPE_HANDLED) |
667 | trace_seq_printf(s, " |"); | 655 | return ret; |
656 | |||
668 | ret = trace_seq_printf(s, "\n"); | 657 | ret = trace_seq_printf(s, "\n"); |
669 | 658 | ||
670 | if (!ret) | 659 | if (!ret) |
@@ -716,9 +705,48 @@ trace_print_graph_duration(unsigned long long duration, struct trace_seq *s) | |||
716 | } | 705 | } |
717 | 706 | ||
718 | static enum print_line_t | 707 | static enum print_line_t |
719 | print_graph_duration(unsigned long long duration, struct trace_seq *s) | 708 | print_graph_duration(unsigned long long duration, struct trace_seq *s, |
709 | u32 flags) | ||
720 | { | 710 | { |
721 | int ret; | 711 | int ret = -1; |
712 | |||
713 | if (!(flags & TRACE_GRAPH_PRINT_DURATION)) | ||
714 | return TRACE_TYPE_HANDLED; | ||
715 | |||
716 | /* No real adata, just filling the column with spaces */ | ||
717 | switch (duration) { | ||
718 | case DURATION_FILL_FULL: | ||
719 | ret = trace_seq_printf(s, " | "); | ||
720 | return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE; | ||
721 | case DURATION_FILL_START: | ||
722 | ret = trace_seq_printf(s, " "); | ||
723 | return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE; | ||
724 | case DURATION_FILL_END: | ||
725 | ret = trace_seq_printf(s, " |"); | ||
726 | return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE; | ||
727 | } | ||
728 | |||
729 | /* Signal a overhead of time execution to the output */ | ||
730 | if (flags & TRACE_GRAPH_PRINT_OVERHEAD) { | ||
731 | /* Duration exceeded 100 msecs */ | ||
732 | if (duration > 100000ULL) | ||
733 | ret = trace_seq_printf(s, "! "); | ||
734 | /* Duration exceeded 10 msecs */ | ||
735 | else if (duration > 10000ULL) | ||
736 | ret = trace_seq_printf(s, "+ "); | ||
737 | } | ||
738 | |||
739 | /* | ||
740 | * The -1 means we either did not exceed the duration tresholds | ||
741 | * or we dont want to print out the overhead. Either way we need | ||
742 | * to fill out the space. | ||
743 | */ | ||
744 | if (ret == -1) | ||
745 | ret = trace_seq_printf(s, " "); | ||
746 | |||
747 | /* Catching here any failure happenned above */ | ||
748 | if (!ret) | ||
749 | return TRACE_TYPE_PARTIAL_LINE; | ||
722 | 750 | ||
723 | ret = trace_print_graph_duration(duration, s); | 751 | ret = trace_print_graph_duration(duration, s); |
724 | if (ret != TRACE_TYPE_HANDLED) | 752 | if (ret != TRACE_TYPE_HANDLED) |
@@ -767,18 +795,11 @@ print_graph_entry_leaf(struct trace_iterator *iter, | |||
767 | cpu_data->enter_funcs[call->depth] = 0; | 795 | cpu_data->enter_funcs[call->depth] = 0; |
768 | } | 796 | } |
769 | 797 | ||
770 | /* Overhead */ | 798 | /* Overhead and duration */ |
771 | ret = print_graph_overhead(duration, s, flags); | 799 | ret = print_graph_duration(duration, s, flags); |
772 | if (!ret) | 800 | if (ret == TRACE_TYPE_PARTIAL_LINE) |
773 | return TRACE_TYPE_PARTIAL_LINE; | 801 | return TRACE_TYPE_PARTIAL_LINE; |
774 | 802 | ||
775 | /* Duration */ | ||
776 | if (flags & TRACE_GRAPH_PRINT_DURATION) { | ||
777 | ret = print_graph_duration(duration, s); | ||
778 | if (ret == TRACE_TYPE_PARTIAL_LINE) | ||
779 | return TRACE_TYPE_PARTIAL_LINE; | ||
780 | } | ||
781 | |||
782 | /* Function */ | 803 | /* Function */ |
783 | for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) { | 804 | for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) { |
784 | ret = trace_seq_printf(s, " "); | 805 | ret = trace_seq_printf(s, " "); |
@@ -815,17 +836,10 @@ print_graph_entry_nested(struct trace_iterator *iter, | |||
815 | cpu_data->enter_funcs[call->depth] = call->func; | 836 | cpu_data->enter_funcs[call->depth] = call->func; |
816 | } | 837 | } |
817 | 838 | ||
818 | /* No overhead */ | ||
819 | ret = print_graph_overhead(-1, s, flags); | ||
820 | if (!ret) | ||
821 | return TRACE_TYPE_PARTIAL_LINE; | ||
822 | |||
823 | /* No time */ | 839 | /* No time */ |
824 | if (flags & TRACE_GRAPH_PRINT_DURATION) { | 840 | ret = print_graph_duration(DURATION_FILL_FULL, s, flags); |
825 | ret = trace_seq_printf(s, " | "); | 841 | if (ret != TRACE_TYPE_HANDLED) |
826 | if (!ret) | 842 | return ret; |
827 | return TRACE_TYPE_PARTIAL_LINE; | ||
828 | } | ||
829 | 843 | ||
830 | /* Function */ | 844 | /* Function */ |
831 | for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) { | 845 | for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) { |
@@ -1078,18 +1092,11 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s, | |||
1078 | if (print_graph_prologue(iter, s, 0, 0, flags)) | 1092 | if (print_graph_prologue(iter, s, 0, 0, flags)) |
1079 | return TRACE_TYPE_PARTIAL_LINE; | 1093 | return TRACE_TYPE_PARTIAL_LINE; |
1080 | 1094 | ||
1081 | /* Overhead */ | 1095 | /* Overhead and duration */ |
1082 | ret = print_graph_overhead(duration, s, flags); | 1096 | ret = print_graph_duration(duration, s, flags); |
1083 | if (!ret) | 1097 | if (ret == TRACE_TYPE_PARTIAL_LINE) |
1084 | return TRACE_TYPE_PARTIAL_LINE; | 1098 | return TRACE_TYPE_PARTIAL_LINE; |
1085 | 1099 | ||
1086 | /* Duration */ | ||
1087 | if (flags & TRACE_GRAPH_PRINT_DURATION) { | ||
1088 | ret = print_graph_duration(duration, s); | ||
1089 | if (ret == TRACE_TYPE_PARTIAL_LINE) | ||
1090 | return TRACE_TYPE_PARTIAL_LINE; | ||
1091 | } | ||
1092 | |||
1093 | /* Closing brace */ | 1100 | /* Closing brace */ |
1094 | for (i = 0; i < trace->depth * TRACE_GRAPH_INDENT; i++) { | 1101 | for (i = 0; i < trace->depth * TRACE_GRAPH_INDENT; i++) { |
1095 | ret = trace_seq_printf(s, " "); | 1102 | ret = trace_seq_printf(s, " "); |
@@ -1146,17 +1153,10 @@ print_graph_comment(struct trace_seq *s, struct trace_entry *ent, | |||
1146 | if (print_graph_prologue(iter, s, 0, 0, flags)) | 1153 | if (print_graph_prologue(iter, s, 0, 0, flags)) |
1147 | return TRACE_TYPE_PARTIAL_LINE; | 1154 | return TRACE_TYPE_PARTIAL_LINE; |
1148 | 1155 | ||
1149 | /* No overhead */ | ||
1150 | ret = print_graph_overhead(-1, s, flags); | ||
1151 | if (!ret) | ||
1152 | return TRACE_TYPE_PARTIAL_LINE; | ||
1153 | |||
1154 | /* No time */ | 1156 | /* No time */ |
1155 | if (flags & TRACE_GRAPH_PRINT_DURATION) { | 1157 | ret = print_graph_duration(DURATION_FILL_FULL, s, flags); |
1156 | ret = trace_seq_printf(s, " | "); | 1158 | if (ret != TRACE_TYPE_HANDLED) |
1157 | if (!ret) | 1159 | return ret; |
1158 | return TRACE_TYPE_PARTIAL_LINE; | ||
1159 | } | ||
1160 | 1160 | ||
1161 | /* Indentation */ | 1161 | /* Indentation */ |
1162 | if (depth > 0) | 1162 | if (depth > 0) |