aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-11-23 02:55:47 -0500
committerIngo Molnar <mingo@elte.hu>2008-11-23 02:55:47 -0500
commitca9eed76133c00e7f4b1eeb4c1a6cb800cd2654c (patch)
tree5f011f4bd00c921e41605b1915c227aeaf411a0d /kernel/trace/trace.c
parent8652cb4b0d87accbe78725fd2a13be2787059649 (diff)
parent13d428afc007fcfcd6deeb215618f54cf9c0cae6 (diff)
Merge commit 'v2.6.28-rc6' into x86/debug
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r--kernel/trace/trace.c68
1 files changed, 47 insertions, 21 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index a610ca771558..d86e3252f300 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -656,7 +656,11 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags,
656 entry->preempt_count = pc & 0xff; 656 entry->preempt_count = pc & 0xff;
657 entry->pid = (tsk) ? tsk->pid : 0; 657 entry->pid = (tsk) ? tsk->pid : 0;
658 entry->flags = 658 entry->flags =
659#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
659 (irqs_disabled_flags(flags) ? TRACE_FLAG_IRQS_OFF : 0) | 660 (irqs_disabled_flags(flags) ? TRACE_FLAG_IRQS_OFF : 0) |
661#else
662 TRACE_FLAG_IRQS_NOSUPPORT |
663#endif
660 ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) | 664 ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) |
661 ((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) | 665 ((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) |
662 (need_resched() ? TRACE_FLAG_NEED_RESCHED : 0); 666 (need_resched() ? TRACE_FLAG_NEED_RESCHED : 0);
@@ -701,6 +705,7 @@ static void ftrace_trace_stack(struct trace_array *tr,
701 unsigned long flags, 705 unsigned long flags,
702 int skip, int pc) 706 int skip, int pc)
703{ 707{
708#ifdef CONFIG_STACKTRACE
704 struct ring_buffer_event *event; 709 struct ring_buffer_event *event;
705 struct stack_entry *entry; 710 struct stack_entry *entry;
706 struct stack_trace trace; 711 struct stack_trace trace;
@@ -726,6 +731,7 @@ static void ftrace_trace_stack(struct trace_array *tr,
726 731
727 save_stack_trace(&trace); 732 save_stack_trace(&trace);
728 ring_buffer_unlock_commit(tr->buffer, event, irq_flags); 733 ring_buffer_unlock_commit(tr->buffer, event, irq_flags);
734#endif
729} 735}
730 736
731void __trace_stack(struct trace_array *tr, 737void __trace_stack(struct trace_array *tr,
@@ -1082,17 +1088,20 @@ static void s_stop(struct seq_file *m, void *p)
1082 mutex_unlock(&trace_types_lock); 1088 mutex_unlock(&trace_types_lock);
1083} 1089}
1084 1090
1085#define KRETPROBE_MSG "[unknown/kretprobe'd]"
1086
1087#ifdef CONFIG_KRETPROBES 1091#ifdef CONFIG_KRETPROBES
1088static inline int kretprobed(unsigned long addr) 1092static inline const char *kretprobed(const char *name)
1089{ 1093{
1090 return addr == (unsigned long)kretprobe_trampoline; 1094 static const char tramp_name[] = "kretprobe_trampoline";
1095 int size = sizeof(tramp_name);
1096
1097 if (strncmp(tramp_name, name, size) == 0)
1098 return "[unknown/kretprobe'd]";
1099 return name;
1091} 1100}
1092#else 1101#else
1093static inline int kretprobed(unsigned long addr) 1102static inline const char *kretprobed(const char *name)
1094{ 1103{
1095 return 0; 1104 return name;
1096} 1105}
1097#endif /* CONFIG_KRETPROBES */ 1106#endif /* CONFIG_KRETPROBES */
1098 1107
@@ -1101,10 +1110,13 @@ seq_print_sym_short(struct trace_seq *s, const char *fmt, unsigned long address)
1101{ 1110{
1102#ifdef CONFIG_KALLSYMS 1111#ifdef CONFIG_KALLSYMS
1103 char str[KSYM_SYMBOL_LEN]; 1112 char str[KSYM_SYMBOL_LEN];
1113 const char *name;
1104 1114
1105 kallsyms_lookup(address, NULL, NULL, NULL, str); 1115 kallsyms_lookup(address, NULL, NULL, NULL, str);
1106 1116
1107 return trace_seq_printf(s, fmt, str); 1117 name = kretprobed(str);
1118
1119 return trace_seq_printf(s, fmt, name);
1108#endif 1120#endif
1109 return 1; 1121 return 1;
1110} 1122}
@@ -1115,9 +1127,12 @@ seq_print_sym_offset(struct trace_seq *s, const char *fmt,
1115{ 1127{
1116#ifdef CONFIG_KALLSYMS 1128#ifdef CONFIG_KALLSYMS
1117 char str[KSYM_SYMBOL_LEN]; 1129 char str[KSYM_SYMBOL_LEN];
1130 const char *name;
1118 1131
1119 sprint_symbol(str, address); 1132 sprint_symbol(str, address);
1120 return trace_seq_printf(s, fmt, str); 1133 name = kretprobed(str);
1134
1135 return trace_seq_printf(s, fmt, name);
1121#endif 1136#endif
1122 return 1; 1137 return 1;
1123} 1138}
@@ -1244,7 +1259,8 @@ lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu)
1244 trace_seq_printf(s, "%8.8s-%-5d ", comm, entry->pid); 1259 trace_seq_printf(s, "%8.8s-%-5d ", comm, entry->pid);
1245 trace_seq_printf(s, "%3d", cpu); 1260 trace_seq_printf(s, "%3d", cpu);
1246 trace_seq_printf(s, "%c%c", 1261 trace_seq_printf(s, "%c%c",
1247 (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' : '.', 1262 (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
1263 (entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 'X' : '.',
1248 ((entry->flags & TRACE_FLAG_NEED_RESCHED) ? 'N' : '.')); 1264 ((entry->flags & TRACE_FLAG_NEED_RESCHED) ? 'N' : '.'));
1249 1265
1250 hardirq = entry->flags & TRACE_FLAG_HARDIRQ; 1266 hardirq = entry->flags & TRACE_FLAG_HARDIRQ;
@@ -1370,10 +1386,7 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)
1370 1386
1371 seq_print_ip_sym(s, field->ip, sym_flags); 1387 seq_print_ip_sym(s, field->ip, sym_flags);
1372 trace_seq_puts(s, " ("); 1388 trace_seq_puts(s, " (");
1373 if (kretprobed(field->parent_ip)) 1389 seq_print_ip_sym(s, field->parent_ip, sym_flags);
1374 trace_seq_puts(s, KRETPROBE_MSG);
1375 else
1376 seq_print_ip_sym(s, field->parent_ip, sym_flags);
1377 trace_seq_puts(s, ")\n"); 1390 trace_seq_puts(s, ")\n");
1378 break; 1391 break;
1379 } 1392 }
@@ -1489,12 +1502,9 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
1489 ret = trace_seq_printf(s, " <-"); 1502 ret = trace_seq_printf(s, " <-");
1490 if (!ret) 1503 if (!ret)
1491 return TRACE_TYPE_PARTIAL_LINE; 1504 return TRACE_TYPE_PARTIAL_LINE;
1492 if (kretprobed(field->parent_ip)) 1505 ret = seq_print_ip_sym(s,
1493 ret = trace_seq_puts(s, KRETPROBE_MSG); 1506 field->parent_ip,
1494 else 1507 sym_flags);
1495 ret = seq_print_ip_sym(s,
1496 field->parent_ip,
1497 sym_flags);
1498 if (!ret) 1508 if (!ret)
1499 return TRACE_TYPE_PARTIAL_LINE; 1509 return TRACE_TYPE_PARTIAL_LINE;
1500 } 1510 }
@@ -1745,7 +1755,7 @@ static enum print_line_t print_bin_fmt(struct trace_iterator *iter)
1745 return TRACE_TYPE_HANDLED; 1755 return TRACE_TYPE_HANDLED;
1746 1756
1747 SEQ_PUT_FIELD_RET(s, entry->pid); 1757 SEQ_PUT_FIELD_RET(s, entry->pid);
1748 SEQ_PUT_FIELD_RET(s, iter->cpu); 1758 SEQ_PUT_FIELD_RET(s, entry->cpu);
1749 SEQ_PUT_FIELD_RET(s, iter->ts); 1759 SEQ_PUT_FIELD_RET(s, iter->ts);
1750 1760
1751 switch (entry->type) { 1761 switch (entry->type) {
@@ -1926,6 +1936,7 @@ __tracing_open(struct inode *inode, struct file *file, int *ret)
1926 ring_buffer_read_finish(iter->buffer_iter[cpu]); 1936 ring_buffer_read_finish(iter->buffer_iter[cpu]);
1927 } 1937 }
1928 mutex_unlock(&trace_types_lock); 1938 mutex_unlock(&trace_types_lock);
1939 kfree(iter);
1929 1940
1930 return ERR_PTR(-ENOMEM); 1941 return ERR_PTR(-ENOMEM);
1931} 1942}
@@ -2666,7 +2677,7 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,
2666{ 2677{
2667 unsigned long val; 2678 unsigned long val;
2668 char buf[64]; 2679 char buf[64];
2669 int ret; 2680 int ret, cpu;
2670 struct trace_array *tr = filp->private_data; 2681 struct trace_array *tr = filp->private_data;
2671 2682
2672 if (cnt >= sizeof(buf)) 2683 if (cnt >= sizeof(buf))
@@ -2694,6 +2705,14 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,
2694 goto out; 2705 goto out;
2695 } 2706 }
2696 2707
2708 /* disable all cpu buffers */
2709 for_each_tracing_cpu(cpu) {
2710 if (global_trace.data[cpu])
2711 atomic_inc(&global_trace.data[cpu]->disabled);
2712 if (max_tr.data[cpu])
2713 atomic_inc(&max_tr.data[cpu]->disabled);
2714 }
2715
2697 if (val != global_trace.entries) { 2716 if (val != global_trace.entries) {
2698 ret = ring_buffer_resize(global_trace.buffer, val); 2717 ret = ring_buffer_resize(global_trace.buffer, val);
2699 if (ret < 0) { 2718 if (ret < 0) {
@@ -2725,6 +2744,13 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,
2725 if (tracing_disabled) 2744 if (tracing_disabled)
2726 cnt = -ENOMEM; 2745 cnt = -ENOMEM;
2727 out: 2746 out:
2747 for_each_tracing_cpu(cpu) {
2748 if (global_trace.data[cpu])
2749 atomic_dec(&global_trace.data[cpu]->disabled);
2750 if (max_tr.data[cpu])
2751 atomic_dec(&max_tr.data[cpu]->disabled);
2752 }
2753
2728 max_tr.entries = global_trace.entries; 2754 max_tr.entries = global_trace.entries;
2729 mutex_unlock(&trace_types_lock); 2755 mutex_unlock(&trace_types_lock);
2730 2756