diff options
| -rw-r--r-- | include/linux/ftrace_event.h | 1 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 9 | ||||
| -rw-r--r-- | kernel/trace/trace_events.c | 5 | ||||
| -rw-r--r-- | kernel/trace/trace_functions_graph.c | 16 | ||||
| -rw-r--r-- | kernel/trace/trace_output.c | 10 |
5 files changed, 31 insertions, 10 deletions
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 06c795b536c2..0608b0ff2635 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
| @@ -34,6 +34,7 @@ struct trace_entry { | |||
| 34 | unsigned char flags; | 34 | unsigned char flags; |
| 35 | unsigned char preempt_count; | 35 | unsigned char preempt_count; |
| 36 | int pid; | 36 | int pid; |
| 37 | int lock_depth; | ||
| 37 | }; | 38 | }; |
| 38 | 39 | ||
| 39 | #define FTRACE_MAX_EVENT \ | 40 | #define FTRACE_MAX_EVENT \ |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 1a37da2e8534..3b918283cf94 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -886,6 +886,7 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, | |||
| 886 | 886 | ||
| 887 | entry->preempt_count = pc & 0xff; | 887 | entry->preempt_count = pc & 0xff; |
| 888 | entry->pid = (tsk) ? tsk->pid : 0; | 888 | entry->pid = (tsk) ? tsk->pid : 0; |
| 889 | entry->lock_depth = (tsk) ? tsk->lock_depth : 0; | ||
| 889 | entry->flags = | 890 | entry->flags = |
| 890 | #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT | 891 | #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT |
| 891 | (irqs_disabled_flags(flags) ? TRACE_FLAG_IRQS_OFF : 0) | | 892 | (irqs_disabled_flags(flags) ? TRACE_FLAG_IRQS_OFF : 0) | |
| @@ -1530,10 +1531,10 @@ static void print_lat_help_header(struct seq_file *m) | |||
| 1530 | seq_puts(m, "# | / _----=> need-resched \n"); | 1531 | seq_puts(m, "# | / _----=> need-resched \n"); |
| 1531 | seq_puts(m, "# || / _---=> hardirq/softirq \n"); | 1532 | seq_puts(m, "# || / _---=> hardirq/softirq \n"); |
| 1532 | seq_puts(m, "# ||| / _--=> preempt-depth \n"); | 1533 | seq_puts(m, "# ||| / _--=> preempt-depth \n"); |
| 1533 | seq_puts(m, "# |||| / \n"); | 1534 | seq_puts(m, "# |||| /_--=> lock-depth \n"); |
| 1534 | seq_puts(m, "# ||||| delay \n"); | 1535 | seq_puts(m, "# |||||/ delay \n"); |
| 1535 | seq_puts(m, "# cmd pid ||||| time | caller \n"); | 1536 | seq_puts(m, "# cmd pid |||||| time | caller \n"); |
| 1536 | seq_puts(m, "# \\ / ||||| \\ | / \n"); | 1537 | seq_puts(m, "# \\ / |||||| \\ | / \n"); |
| 1537 | } | 1538 | } |
| 1538 | 1539 | ||
| 1539 | static void print_func_help_header(struct seq_file *m) | 1540 | static void print_func_help_header(struct seq_file *m) |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 28d92027a93c..975f324a07e7 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
| @@ -86,6 +86,7 @@ int trace_define_common_fields(struct ftrace_event_call *call) | |||
| 86 | __common_field(unsigned char, flags); | 86 | __common_field(unsigned char, flags); |
| 87 | __common_field(unsigned char, preempt_count); | 87 | __common_field(unsigned char, preempt_count); |
| 88 | __common_field(int, pid); | 88 | __common_field(int, pid); |
| 89 | __common_field(int, lock_depth); | ||
| 89 | 90 | ||
| 90 | return ret; | 91 | return ret; |
| 91 | } | 92 | } |
| @@ -571,11 +572,13 @@ static int trace_write_header(struct trace_seq *s) | |||
| 571 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" | 572 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" |
| 572 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" | 573 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" |
| 573 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" | 574 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" |
| 575 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" | ||
| 574 | "\n", | 576 | "\n", |
| 575 | FIELD(unsigned short, type), | 577 | FIELD(unsigned short, type), |
| 576 | FIELD(unsigned char, flags), | 578 | FIELD(unsigned char, flags), |
| 577 | FIELD(unsigned char, preempt_count), | 579 | FIELD(unsigned char, preempt_count), |
| 578 | FIELD(int, pid)); | 580 | FIELD(int, pid), |
| 581 | FIELD(int, lock_depth)); | ||
| 579 | } | 582 | } |
| 580 | 583 | ||
| 581 | static ssize_t | 584 | static ssize_t |
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index ee791a9650c5..48af49374384 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c | |||
| @@ -368,6 +368,7 @@ static enum print_line_t | |||
| 368 | print_graph_lat_fmt(struct trace_seq *s, struct trace_entry *entry) | 368 | print_graph_lat_fmt(struct trace_seq *s, struct trace_entry *entry) |
| 369 | { | 369 | { |
| 370 | int hardirq, softirq; | 370 | int hardirq, softirq; |
| 371 | int ret; | ||
| 371 | 372 | ||
| 372 | hardirq = entry->flags & TRACE_FLAG_HARDIRQ; | 373 | hardirq = entry->flags & TRACE_FLAG_HARDIRQ; |
| 373 | softirq = entry->flags & TRACE_FLAG_SOFTIRQ; | 374 | softirq = entry->flags & TRACE_FLAG_SOFTIRQ; |
| @@ -382,6 +383,13 @@ print_graph_lat_fmt(struct trace_seq *s, struct trace_entry *entry) | |||
| 382 | hardirq ? 'h' : softirq ? 's' : '.')) | 383 | hardirq ? 'h' : softirq ? 's' : '.')) |
| 383 | return 0; | 384 | return 0; |
| 384 | 385 | ||
| 386 | if (entry->lock_depth < 0) | ||
| 387 | ret = trace_seq_putc(s, '.'); | ||
| 388 | else | ||
| 389 | ret = trace_seq_printf(s, "%d", entry->lock_depth); | ||
| 390 | if (!ret) | ||
| 391 | return 0; | ||
| 392 | |||
| 385 | if (entry->preempt_count) | 393 | if (entry->preempt_count) |
| 386 | return trace_seq_printf(s, "%x", entry->preempt_count); | 394 | return trace_seq_printf(s, "%x", entry->preempt_count); |
| 387 | return trace_seq_puts(s, "."); | 395 | return trace_seq_puts(s, "."); |
| @@ -1001,8 +1009,8 @@ static void print_lat_header(struct seq_file *s) | |||
| 1001 | seq_printf(s, "#%.*s / _----=> need-resched \n", size, spaces); | 1009 | seq_printf(s, "#%.*s / _----=> need-resched \n", size, spaces); |
| 1002 | seq_printf(s, "#%.*s| / _---=> hardirq/softirq \n", size, spaces); | 1010 | seq_printf(s, "#%.*s| / _---=> hardirq/softirq \n", size, spaces); |
| 1003 | seq_printf(s, "#%.*s|| / _--=> preempt-depth \n", size, spaces); | 1011 | seq_printf(s, "#%.*s|| / _--=> preempt-depth \n", size, spaces); |
| 1004 | seq_printf(s, "#%.*s||| / \n", size, spaces); | 1012 | seq_printf(s, "#%.*s||| / _-=> lock-depth \n", size, spaces); |
| 1005 | seq_printf(s, "#%.*s|||| \n", size, spaces); | 1013 | seq_printf(s, "#%.*s|||| / \n", size, spaces); |
| 1006 | } | 1014 | } |
| 1007 | 1015 | ||
| 1008 | static void print_graph_headers(struct seq_file *s) | 1016 | static void print_graph_headers(struct seq_file *s) |
| @@ -1021,7 +1029,7 @@ static void print_graph_headers(struct seq_file *s) | |||
| 1021 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) | 1029 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) |
| 1022 | seq_printf(s, " TASK/PID "); | 1030 | seq_printf(s, " TASK/PID "); |
| 1023 | if (lat) | 1031 | if (lat) |
| 1024 | seq_printf(s, "||||"); | 1032 | seq_printf(s, "|||||"); |
| 1025 | if (tracer_flags.val & TRACE_GRAPH_PRINT_DURATION) | 1033 | if (tracer_flags.val & TRACE_GRAPH_PRINT_DURATION) |
| 1026 | seq_printf(s, " DURATION "); | 1034 | seq_printf(s, " DURATION "); |
| 1027 | seq_printf(s, " FUNCTION CALLS\n"); | 1035 | seq_printf(s, " FUNCTION CALLS\n"); |
| @@ -1035,7 +1043,7 @@ static void print_graph_headers(struct seq_file *s) | |||
| 1035 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) | 1043 | if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) |
| 1036 | seq_printf(s, " | | "); | 1044 | seq_printf(s, " | | "); |
| 1037 | if (lat) | 1045 | if (lat) |
| 1038 | seq_printf(s, "||||"); | 1046 | seq_printf(s, "|||||"); |
| 1039 | if (tracer_flags.val & TRACE_GRAPH_PRINT_DURATION) | 1047 | if (tracer_flags.val & TRACE_GRAPH_PRINT_DURATION) |
| 1040 | seq_printf(s, " | | "); | 1048 | seq_printf(s, " | | "); |
| 1041 | seq_printf(s, " | | | |\n"); | 1049 | seq_printf(s, " | | | |\n"); |
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index be34a6aa7e4d..29a370a45582 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
| @@ -465,6 +465,7 @@ lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu) | |||
| 465 | { | 465 | { |
| 466 | int hardirq, softirq; | 466 | int hardirq, softirq; |
| 467 | char comm[TASK_COMM_LEN]; | 467 | char comm[TASK_COMM_LEN]; |
| 468 | int ret; | ||
| 468 | 469 | ||
| 469 | trace_find_cmdline(entry->pid, comm); | 470 | trace_find_cmdline(entry->pid, comm); |
| 470 | hardirq = entry->flags & TRACE_FLAG_HARDIRQ; | 471 | hardirq = entry->flags & TRACE_FLAG_HARDIRQ; |
| @@ -481,9 +482,16 @@ lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu) | |||
| 481 | hardirq ? 'h' : softirq ? 's' : '.')) | 482 | hardirq ? 'h' : softirq ? 's' : '.')) |
| 482 | return 0; | 483 | return 0; |
| 483 | 484 | ||
| 485 | if (entry->lock_depth < 0) | ||
| 486 | ret = trace_seq_putc(s, '.'); | ||
| 487 | else | ||
| 488 | ret = trace_seq_printf(s, "%d", entry->lock_depth); | ||
| 489 | if (!ret) | ||
| 490 | return 0; | ||
| 491 | |||
| 484 | if (entry->preempt_count) | 492 | if (entry->preempt_count) |
| 485 | return trace_seq_printf(s, "%x", entry->preempt_count); | 493 | return trace_seq_printf(s, "%x", entry->preempt_count); |
| 486 | return trace_seq_puts(s, "."); | 494 | return trace_seq_putc(s, '.'); |
| 487 | } | 495 | } |
| 488 | 496 | ||
| 489 | static unsigned long preempt_mark_thresh = 100; | 497 | static unsigned long preempt_mark_thresh = 100; |
