aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_output.c
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2009-12-07 01:28:35 -0500
committerFrederic Weisbecker <fweisbec@gmail.com>2009-12-07 01:29:22 -0500
commit6548698f929814375fa5d62ae1db96959b0418c1 (patch)
tree340924ae82cb0946aa15045b2b72186de52a8146 /kernel/trace/trace_output.c
parent1d2c6cfd40b2dece3bb958cbbc405a2c1536ab75 (diff)
parent22763c5cf3690a681551162c15d34d935308c8d7 (diff)
Merge commit 'v2.6.32' into reiserfs/kill-bkl
Merge-reason: The tree was based 2.6.31. It's better to be up to date with 2.6.32. Although no conflicting changes were made in between, it gives benchmarking results closer to the lastest kernel behaviour.
Diffstat (limited to 'kernel/trace/trace_output.c')
-rw-r--r--kernel/trace/trace_output.c55
1 files changed, 43 insertions, 12 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c
index e0c2545622e8..b6c12c6a1bcd 100644
--- a/kernel/trace/trace_output.c
+++ b/kernel/trace/trace_output.c
@@ -69,6 +69,9 @@ enum print_line_t trace_print_printk_msg_only(struct trace_iterator *iter)
69 * @s: trace sequence descriptor 69 * @s: trace sequence descriptor
70 * @fmt: printf format string 70 * @fmt: printf format string
71 * 71 *
72 * It returns 0 if the trace oversizes the buffer's free
73 * space, 1 otherwise.
74 *
72 * The tracer may use either sequence operations or its own 75 * The tracer may use either sequence operations or its own
73 * copy to user routines. To simplify formating of a trace 76 * copy to user routines. To simplify formating of a trace
74 * trace_seq_printf is used to store strings into a special 77 * trace_seq_printf is used to store strings into a special
@@ -95,7 +98,7 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
95 98
96 s->len += ret; 99 s->len += ret;
97 100
98 return len; 101 return 1;
99} 102}
100EXPORT_SYMBOL_GPL(trace_seq_printf); 103EXPORT_SYMBOL_GPL(trace_seq_printf);
101 104
@@ -407,7 +410,7 @@ seq_print_userip_objs(const struct userstack_entry *entry, struct trace_seq *s,
407 * since individual threads might have already quit! 410 * since individual threads might have already quit!
408 */ 411 */
409 rcu_read_lock(); 412 rcu_read_lock();
410 task = find_task_by_vpid(entry->ent.tgid); 413 task = find_task_by_vpid(entry->tgid);
411 if (task) 414 if (task)
412 mm = get_task_mm(task); 415 mm = get_task_mm(task);
413 rcu_read_unlock(); 416 rcu_read_unlock();
@@ -460,18 +463,23 @@ seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags)
460 return ret; 463 return ret;
461} 464}
462 465
463static int 466/**
464lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu) 467 * trace_print_lat_fmt - print the irq, preempt and lockdep fields
468 * @s: trace seq struct to write to
469 * @entry: The trace entry field from the ring buffer
470 *
471 * Prints the generic fields of irqs off, in hard or softirq, preempt
472 * count and lock depth.
473 */
474int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
465{ 475{
466 int hardirq, softirq; 476 int hardirq, softirq;
467 char comm[TASK_COMM_LEN]; 477 int ret;
468 478
469 trace_find_cmdline(entry->pid, comm);
470 hardirq = entry->flags & TRACE_FLAG_HARDIRQ; 479 hardirq = entry->flags & TRACE_FLAG_HARDIRQ;
471 softirq = entry->flags & TRACE_FLAG_SOFTIRQ; 480 softirq = entry->flags & TRACE_FLAG_SOFTIRQ;
472 481
473 if (!trace_seq_printf(s, "%8.8s-%-5d %3d%c%c%c", 482 if (!trace_seq_printf(s, "%c%c%c",
474 comm, entry->pid, cpu,
475 (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' : 483 (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
476 (entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 484 (entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
477 'X' : '.', 485 'X' : '.',
@@ -482,8 +490,31 @@ lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu)
482 return 0; 490 return 0;
483 491
484 if (entry->preempt_count) 492 if (entry->preempt_count)
485 return trace_seq_printf(s, "%x", entry->preempt_count); 493 ret = trace_seq_printf(s, "%x", entry->preempt_count);
486 return trace_seq_puts(s, "."); 494 else
495 ret = trace_seq_putc(s, '.');
496
497 if (!ret)
498 return 0;
499
500 if (entry->lock_depth < 0)
501 return trace_seq_putc(s, '.');
502
503 return trace_seq_printf(s, "%d", entry->lock_depth);
504}
505
506static int
507lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu)
508{
509 char comm[TASK_COMM_LEN];
510
511 trace_find_cmdline(entry->pid, comm);
512
513 if (!trace_seq_printf(s, "%8.8s-%-5d %3d",
514 comm, entry->pid, cpu))
515 return 0;
516
517 return trace_print_lat_fmt(s, entry);
487} 518}
488 519
489static unsigned long preempt_mark_thresh = 100; 520static unsigned long preempt_mark_thresh = 100;
@@ -857,7 +888,7 @@ static int trace_ctxwake_raw(struct trace_iterator *iter, char S)
857 trace_assign_type(field, iter->ent); 888 trace_assign_type(field, iter->ent);
858 889
859 if (!S) 890 if (!S)
860 task_state_char(field->prev_state); 891 S = task_state_char(field->prev_state);
861 T = task_state_char(field->next_state); 892 T = task_state_char(field->next_state);
862 if (!trace_seq_printf(&iter->seq, "%d %d %c %d %d %d %c\n", 893 if (!trace_seq_printf(&iter->seq, "%d %d %c %d %d %d %c\n",
863 field->prev_pid, 894 field->prev_pid,
@@ -892,7 +923,7 @@ static int trace_ctxwake_hex(struct trace_iterator *iter, char S)
892 trace_assign_type(field, iter->ent); 923 trace_assign_type(field, iter->ent);
893 924
894 if (!S) 925 if (!S)
895 task_state_char(field->prev_state); 926 S = task_state_char(field->prev_state);
896 T = task_state_char(field->next_state); 927 T = task_state_char(field->next_state);
897 928
898 SEQ_PUT_HEX_FIELD_RET(s, field->prev_pid); 929 SEQ_PUT_HEX_FIELD_RET(s, field->prev_pid);