diff options
Diffstat (limited to 'kernel/trace/trace_events.c')
-rw-r--r-- | kernel/trace/trace_events.c | 57 |
1 files changed, 49 insertions, 8 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 0cc51edde3a8..366a78a3e61e 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -212,8 +212,40 @@ void *ftrace_event_buffer_reserve(struct ftrace_event_buffer *fbuffer, | |||
212 | } | 212 | } |
213 | EXPORT_SYMBOL_GPL(ftrace_event_buffer_reserve); | 213 | EXPORT_SYMBOL_GPL(ftrace_event_buffer_reserve); |
214 | 214 | ||
215 | static DEFINE_SPINLOCK(tracepoint_iter_lock); | ||
216 | |||
217 | static void output_printk(struct ftrace_event_buffer *fbuffer) | ||
218 | { | ||
219 | struct ftrace_event_call *event_call; | ||
220 | struct trace_event *event; | ||
221 | unsigned long flags; | ||
222 | struct trace_iterator *iter = tracepoint_print_iter; | ||
223 | |||
224 | if (!iter) | ||
225 | return; | ||
226 | |||
227 | event_call = fbuffer->ftrace_file->event_call; | ||
228 | if (!event_call || !event_call->event.funcs || | ||
229 | !event_call->event.funcs->trace) | ||
230 | return; | ||
231 | |||
232 | event = &fbuffer->ftrace_file->event_call->event; | ||
233 | |||
234 | spin_lock_irqsave(&tracepoint_iter_lock, flags); | ||
235 | trace_seq_init(&iter->seq); | ||
236 | iter->ent = fbuffer->entry; | ||
237 | event_call->event.funcs->trace(iter, 0, event); | ||
238 | trace_seq_putc(&iter->seq, 0); | ||
239 | printk("%s", iter->seq.buffer); | ||
240 | |||
241 | spin_unlock_irqrestore(&tracepoint_iter_lock, flags); | ||
242 | } | ||
243 | |||
215 | void ftrace_event_buffer_commit(struct ftrace_event_buffer *fbuffer) | 244 | void ftrace_event_buffer_commit(struct ftrace_event_buffer *fbuffer) |
216 | { | 245 | { |
246 | if (tracepoint_printk) | ||
247 | output_printk(fbuffer); | ||
248 | |||
217 | event_trigger_unlock_commit(fbuffer->ftrace_file, fbuffer->buffer, | 249 | event_trigger_unlock_commit(fbuffer->ftrace_file, fbuffer->buffer, |
218 | fbuffer->event, fbuffer->entry, | 250 | fbuffer->event, fbuffer->entry, |
219 | fbuffer->flags, fbuffer->pc); | 251 | fbuffer->flags, fbuffer->pc); |
@@ -461,7 +493,7 @@ static void remove_event_file_dir(struct ftrace_event_file *file) | |||
461 | 493 | ||
462 | if (dir) { | 494 | if (dir) { |
463 | spin_lock(&dir->d_lock); /* probably unneeded */ | 495 | spin_lock(&dir->d_lock); /* probably unneeded */ |
464 | list_for_each_entry(child, &dir->d_subdirs, d_u.d_child) { | 496 | list_for_each_entry(child, &dir->d_subdirs, d_child) { |
465 | if (child->d_inode) /* probably unneeded */ | 497 | if (child->d_inode) /* probably unneeded */ |
466 | child->d_inode->i_private = NULL; | 498 | child->d_inode->i_private = NULL; |
467 | } | 499 | } |
@@ -918,7 +950,7 @@ static int f_show(struct seq_file *m, void *v) | |||
918 | case FORMAT_HEADER: | 950 | case FORMAT_HEADER: |
919 | seq_printf(m, "name: %s\n", ftrace_event_name(call)); | 951 | seq_printf(m, "name: %s\n", ftrace_event_name(call)); |
920 | seq_printf(m, "ID: %d\n", call->event.type); | 952 | seq_printf(m, "ID: %d\n", call->event.type); |
921 | seq_printf(m, "format:\n"); | 953 | seq_puts(m, "format:\n"); |
922 | return 0; | 954 | return 0; |
923 | 955 | ||
924 | case FORMAT_FIELD_SEPERATOR: | 956 | case FORMAT_FIELD_SEPERATOR: |
@@ -1044,7 +1076,8 @@ event_filter_read(struct file *filp, char __user *ubuf, size_t cnt, | |||
1044 | mutex_unlock(&event_mutex); | 1076 | mutex_unlock(&event_mutex); |
1045 | 1077 | ||
1046 | if (file) | 1078 | if (file) |
1047 | r = simple_read_from_buffer(ubuf, cnt, ppos, s->buffer, s->len); | 1079 | r = simple_read_from_buffer(ubuf, cnt, ppos, |
1080 | s->buffer, trace_seq_used(s)); | ||
1048 | 1081 | ||
1049 | kfree(s); | 1082 | kfree(s); |
1050 | 1083 | ||
@@ -1210,7 +1243,8 @@ subsystem_filter_read(struct file *filp, char __user *ubuf, size_t cnt, | |||
1210 | trace_seq_init(s); | 1243 | trace_seq_init(s); |
1211 | 1244 | ||
1212 | print_subsystem_event_filter(system, s); | 1245 | print_subsystem_event_filter(system, s); |
1213 | r = simple_read_from_buffer(ubuf, cnt, ppos, s->buffer, s->len); | 1246 | r = simple_read_from_buffer(ubuf, cnt, ppos, |
1247 | s->buffer, trace_seq_used(s)); | ||
1214 | 1248 | ||
1215 | kfree(s); | 1249 | kfree(s); |
1216 | 1250 | ||
@@ -1265,7 +1299,8 @@ show_header(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) | |||
1265 | trace_seq_init(s); | 1299 | trace_seq_init(s); |
1266 | 1300 | ||
1267 | func(s); | 1301 | func(s); |
1268 | r = simple_read_from_buffer(ubuf, cnt, ppos, s->buffer, s->len); | 1302 | r = simple_read_from_buffer(ubuf, cnt, ppos, |
1303 | s->buffer, trace_seq_used(s)); | ||
1269 | 1304 | ||
1270 | kfree(s); | 1305 | kfree(s); |
1271 | 1306 | ||
@@ -1988,7 +2023,7 @@ event_enable_print(struct seq_file *m, unsigned long ip, | |||
1988 | ftrace_event_name(data->file->event_call)); | 2023 | ftrace_event_name(data->file->event_call)); |
1989 | 2024 | ||
1990 | if (data->count == -1) | 2025 | if (data->count == -1) |
1991 | seq_printf(m, ":unlimited\n"); | 2026 | seq_puts(m, ":unlimited\n"); |
1992 | else | 2027 | else |
1993 | seq_printf(m, ":count=%ld\n", data->count); | 2028 | seq_printf(m, ":count=%ld\n", data->count); |
1994 | 2029 | ||
@@ -2477,8 +2512,14 @@ static __init int event_trace_init(void) | |||
2477 | #endif | 2512 | #endif |
2478 | return 0; | 2513 | return 0; |
2479 | } | 2514 | } |
2480 | early_initcall(event_trace_memsetup); | 2515 | |
2481 | core_initcall(event_trace_enable); | 2516 | void __init trace_event_init(void) |
2517 | { | ||
2518 | event_trace_memsetup(); | ||
2519 | init_ftrace_syscalls(); | ||
2520 | event_trace_enable(); | ||
2521 | } | ||
2522 | |||
2482 | fs_initcall(event_trace_init); | 2523 | fs_initcall(event_trace_init); |
2483 | 2524 | ||
2484 | #ifdef CONFIG_FTRACE_STARTUP_TEST | 2525 | #ifdef CONFIG_FTRACE_STARTUP_TEST |