diff options
Diffstat (limited to 'kernel/trace/trace_functions_graph.c')
| -rw-r--r-- | kernel/trace/trace_functions_graph.c | 66 |
1 files changed, 57 insertions, 9 deletions
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index b3749a2c3132..45e6c01b2e4d 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c | |||
| @@ -124,7 +124,7 @@ ftrace_pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret, | |||
| 124 | if (unlikely(current->ret_stack[index].fp != frame_pointer)) { | 124 | if (unlikely(current->ret_stack[index].fp != frame_pointer)) { |
| 125 | ftrace_graph_stop(); | 125 | ftrace_graph_stop(); |
| 126 | WARN(1, "Bad frame pointer: expected %lx, received %lx\n" | 126 | WARN(1, "Bad frame pointer: expected %lx, received %lx\n" |
| 127 | " from func %pF return to %lx\n", | 127 | " from func %ps return to %lx\n", |
| 128 | current->ret_stack[index].fp, | 128 | current->ret_stack[index].fp, |
| 129 | frame_pointer, | 129 | frame_pointer, |
| 130 | (void *)current->ret_stack[index].func, | 130 | (void *)current->ret_stack[index].func, |
| @@ -364,6 +364,15 @@ print_graph_proc(struct trace_seq *s, pid_t pid) | |||
| 364 | } | 364 | } |
| 365 | 365 | ||
| 366 | 366 | ||
| 367 | static enum print_line_t | ||
| 368 | print_graph_lat_fmt(struct trace_seq *s, struct trace_entry *entry) | ||
| 369 | { | ||
| 370 | if (!trace_seq_putc(s, ' ')) | ||
| 371 | return 0; | ||
| 372 | |||
| 373 | return trace_print_lat_fmt(s, entry); | ||
| 374 | } | ||
| 375 | |||
| 367 | /* If the pid changed since the last trace, output this event */ | 376 | /* If the pid changed since the last trace, output this event */ |
| 368 | static enum print_line_t | 377 | static enum print_line_t |
| 369 | verif_pid(struct trace_seq *s, pid_t pid, int cpu, struct fgraph_data *data) | 378 | verif_pid(struct trace_seq *s, pid_t pid, int cpu, struct fgraph_data *data) |
| @@ -521,6 +530,7 @@ print_graph_irq(struct trace_iterator *iter, unsigned long addr, | |||
| 521 | if (ret == TRACE_TYPE_PARTIAL_LINE) | 530 | if (ret == TRACE_TYPE_PARTIAL_LINE) |
| 522 | return TRACE_TYPE_PARTIAL_LINE; | 531 | return TRACE_TYPE_PARTIAL_LINE; |
| 523 | } | 532 | } |
| 533 | |||
| 524 | /* Proc */ | 534 | /* Proc */ |
| 525 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) { | 535 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) { |
| 526 | ret = print_graph_proc(s, pid); | 536 | ret = print_graph_proc(s, pid); |
| @@ -659,7 +669,7 @@ print_graph_entry_leaf(struct trace_iterator *iter, | |||
| 659 | return TRACE_TYPE_PARTIAL_LINE; | 669 | return TRACE_TYPE_PARTIAL_LINE; |
| 660 | } | 670 | } |
| 661 | 671 | ||
| 662 | ret = trace_seq_printf(s, "%pf();\n", (void *)call->func); | 672 | ret = trace_seq_printf(s, "%ps();\n", (void *)call->func); |
| 663 | if (!ret) | 673 | if (!ret) |
| 664 | return TRACE_TYPE_PARTIAL_LINE; | 674 | return TRACE_TYPE_PARTIAL_LINE; |
| 665 | 675 | ||
| @@ -702,7 +712,7 @@ print_graph_entry_nested(struct trace_iterator *iter, | |||
| 702 | return TRACE_TYPE_PARTIAL_LINE; | 712 | return TRACE_TYPE_PARTIAL_LINE; |
| 703 | } | 713 | } |
| 704 | 714 | ||
| 705 | ret = trace_seq_printf(s, "%pf() {\n", (void *)call->func); | 715 | ret = trace_seq_printf(s, "%ps() {\n", (void *)call->func); |
| 706 | if (!ret) | 716 | if (!ret) |
| 707 | return TRACE_TYPE_PARTIAL_LINE; | 717 | return TRACE_TYPE_PARTIAL_LINE; |
| 708 | 718 | ||
| @@ -758,6 +768,13 @@ print_graph_prologue(struct trace_iterator *iter, struct trace_seq *s, | |||
| 758 | return TRACE_TYPE_PARTIAL_LINE; | 768 | return TRACE_TYPE_PARTIAL_LINE; |
| 759 | } | 769 | } |
| 760 | 770 | ||
| 771 | /* Latency format */ | ||
| 772 | if (trace_flags & TRACE_ITER_LATENCY_FMT) { | ||
| 773 | ret = print_graph_lat_fmt(s, ent); | ||
| 774 | if (ret == TRACE_TYPE_PARTIAL_LINE) | ||
| 775 | return TRACE_TYPE_PARTIAL_LINE; | ||
| 776 | } | ||
| 777 | |||
| 761 | return 0; | 778 | return 0; |
| 762 | } | 779 | } |
| 763 | 780 | ||
| @@ -952,28 +969,59 @@ print_graph_function(struct trace_iterator *iter) | |||
| 952 | return TRACE_TYPE_HANDLED; | 969 | return TRACE_TYPE_HANDLED; |
| 953 | } | 970 | } |
| 954 | 971 | ||
| 972 | static void print_lat_header(struct seq_file *s) | ||
| 973 | { | ||
| 974 | static const char spaces[] = " " /* 16 spaces */ | ||
| 975 | " " /* 4 spaces */ | ||
| 976 | " "; /* 17 spaces */ | ||
| 977 | int size = 0; | ||
| 978 | |||
| 979 | if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME) | ||
| 980 | size += 16; | ||
| 981 | if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) | ||
| 982 | size += 4; | ||
| 983 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) | ||
| 984 | size += 17; | ||
| 985 | |||
| 986 | seq_printf(s, "#%.*s _-----=> irqs-off \n", size, spaces); | ||
| 987 | seq_printf(s, "#%.*s / _----=> need-resched \n", size, spaces); | ||
| 988 | seq_printf(s, "#%.*s| / _---=> hardirq/softirq \n", size, spaces); | ||
| 989 | seq_printf(s, "#%.*s|| / _--=> preempt-depth \n", size, spaces); | ||
| 990 | seq_printf(s, "#%.*s||| / _-=> lock-depth \n", size, spaces); | ||
| 991 | seq_printf(s, "#%.*s|||| / \n", size, spaces); | ||
| 992 | } | ||
| 993 | |||
| 955 | static void print_graph_headers(struct seq_file *s) | 994 | static void print_graph_headers(struct seq_file *s) |
| 956 | { | 995 | { |
| 996 | int lat = trace_flags & TRACE_ITER_LATENCY_FMT; | ||
| 997 | |||
| 998 | if (lat) | ||
| 999 | print_lat_header(s); | ||
| 1000 | |||
| 957 | /* 1st line */ | 1001 | /* 1st line */ |
| 958 | seq_printf(s, "# "); | 1002 | seq_printf(s, "#"); |
| 959 | if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME) | 1003 | if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME) |
| 960 | seq_printf(s, " TIME "); | 1004 | seq_printf(s, " TIME "); |
| 961 | if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) | 1005 | if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) |
| 962 | seq_printf(s, "CPU"); | 1006 | seq_printf(s, " CPU"); |
| 963 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) | 1007 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) |
| 964 | seq_printf(s, " TASK/PID "); | 1008 | seq_printf(s, " TASK/PID "); |
| 1009 | if (lat) | ||
| 1010 | seq_printf(s, "|||||"); | ||
| 965 | if (tracer_flags.val & TRACE_GRAPH_PRINT_DURATION) | 1011 | if (tracer_flags.val & TRACE_GRAPH_PRINT_DURATION) |
| 966 | seq_printf(s, " DURATION "); | 1012 | seq_printf(s, " DURATION "); |
| 967 | seq_printf(s, " FUNCTION CALLS\n"); | 1013 | seq_printf(s, " FUNCTION CALLS\n"); |
| 968 | 1014 | ||
| 969 | /* 2nd line */ | 1015 | /* 2nd line */ |
| 970 | seq_printf(s, "# "); | 1016 | seq_printf(s, "#"); |
| 971 | if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME) | 1017 | if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME) |
| 972 | seq_printf(s, " | "); | 1018 | seq_printf(s, " | "); |
| 973 | if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) | 1019 | if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) |
| 974 | seq_printf(s, "| "); | 1020 | seq_printf(s, " | "); |
| 975 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) | 1021 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) |
| 976 | seq_printf(s, " | | "); | 1022 | seq_printf(s, " | | "); |
| 1023 | if (lat) | ||
| 1024 | seq_printf(s, "|||||"); | ||
| 977 | if (tracer_flags.val & TRACE_GRAPH_PRINT_DURATION) | 1025 | if (tracer_flags.val & TRACE_GRAPH_PRINT_DURATION) |
| 978 | seq_printf(s, " | | "); | 1026 | seq_printf(s, " | | "); |
| 979 | seq_printf(s, " | | | |\n"); | 1027 | seq_printf(s, " | | | |\n"); |
