diff options
Diffstat (limited to 'kernel/trace/trace_output.c')
| -rw-r--r-- | kernel/trace/trace_output.c | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 7938f3ae93e3..f572f44c6e1e 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
| @@ -27,8 +27,7 @@ void trace_print_seq(struct seq_file *m, struct trace_seq *s) | |||
| 27 | { | 27 | { |
| 28 | int len = s->len >= PAGE_SIZE ? PAGE_SIZE - 1 : s->len; | 28 | int len = s->len >= PAGE_SIZE ? PAGE_SIZE - 1 : s->len; |
| 29 | 29 | ||
| 30 | s->buffer[len] = 0; | 30 | seq_write(m, s->buffer, len); |
| 31 | seq_puts(m, s->buffer); | ||
| 32 | 31 | ||
| 33 | trace_seq_init(s); | 32 | trace_seq_init(s); |
| 34 | } | 33 | } |
| @@ -408,7 +407,7 @@ seq_print_userip_objs(const struct userstack_entry *entry, struct trace_seq *s, | |||
| 408 | * since individual threads might have already quit! | 407 | * since individual threads might have already quit! |
| 409 | */ | 408 | */ |
| 410 | rcu_read_lock(); | 409 | rcu_read_lock(); |
| 411 | task = find_task_by_vpid(entry->ent.tgid); | 410 | task = find_task_by_vpid(entry->tgid); |
| 412 | if (task) | 411 | if (task) |
| 413 | mm = get_task_mm(task); | 412 | mm = get_task_mm(task); |
| 414 | rcu_read_unlock(); | 413 | rcu_read_unlock(); |
| @@ -461,18 +460,23 @@ seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags) | |||
| 461 | return ret; | 460 | return ret; |
| 462 | } | 461 | } |
| 463 | 462 | ||
| 464 | static int | 463 | /** |
| 465 | lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu) | 464 | * trace_print_lat_fmt - print the irq, preempt and lockdep fields |
| 465 | * @s: trace seq struct to write to | ||
| 466 | * @entry: The trace entry field from the ring buffer | ||
| 467 | * | ||
| 468 | * Prints the generic fields of irqs off, in hard or softirq, preempt | ||
| 469 | * count and lock depth. | ||
| 470 | */ | ||
| 471 | int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) | ||
| 466 | { | 472 | { |
| 467 | int hardirq, softirq; | 473 | int hardirq, softirq; |
| 468 | char comm[TASK_COMM_LEN]; | 474 | int ret; |
| 469 | 475 | ||
| 470 | trace_find_cmdline(entry->pid, comm); | ||
| 471 | hardirq = entry->flags & TRACE_FLAG_HARDIRQ; | 476 | hardirq = entry->flags & TRACE_FLAG_HARDIRQ; |
| 472 | softirq = entry->flags & TRACE_FLAG_SOFTIRQ; | 477 | softirq = entry->flags & TRACE_FLAG_SOFTIRQ; |
| 473 | 478 | ||
| 474 | if (!trace_seq_printf(s, "%8.8s-%-5d %3d%c%c%c", | 479 | if (!trace_seq_printf(s, "%c%c%c", |
| 475 | comm, entry->pid, cpu, | ||
| 476 | (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' : | 480 | (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' : |
| 477 | (entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? | 481 | (entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? |
| 478 | 'X' : '.', | 482 | 'X' : '.', |
| @@ -482,9 +486,30 @@ lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu) | |||
| 482 | hardirq ? 'h' : softirq ? 's' : '.')) | 486 | hardirq ? 'h' : softirq ? 's' : '.')) |
| 483 | return 0; | 487 | return 0; |
| 484 | 488 | ||
| 489 | if (entry->lock_depth < 0) | ||
| 490 | ret = trace_seq_putc(s, '.'); | ||
| 491 | else | ||
| 492 | ret = trace_seq_printf(s, "%d", entry->lock_depth); | ||
| 493 | if (!ret) | ||
| 494 | return 0; | ||
| 495 | |||
| 485 | if (entry->preempt_count) | 496 | if (entry->preempt_count) |
| 486 | return trace_seq_printf(s, "%x", entry->preempt_count); | 497 | return trace_seq_printf(s, "%x", entry->preempt_count); |
| 487 | return trace_seq_puts(s, "."); | 498 | return trace_seq_putc(s, '.'); |
| 499 | } | ||
| 500 | |||
| 501 | static int | ||
| 502 | lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu) | ||
| 503 | { | ||
| 504 | char comm[TASK_COMM_LEN]; | ||
| 505 | |||
| 506 | trace_find_cmdline(entry->pid, comm); | ||
| 507 | |||
| 508 | if (!trace_seq_printf(s, "%8.8s-%-5d %3d", | ||
| 509 | comm, entry->pid, cpu)) | ||
| 510 | return 0; | ||
| 511 | |||
| 512 | return trace_print_lat_fmt(s, entry); | ||
| 488 | } | 513 | } |
| 489 | 514 | ||
| 490 | static unsigned long preempt_mark_thresh = 100; | 515 | static unsigned long preempt_mark_thresh = 100; |
