diff options
Diffstat (limited to 'kernel/trace/trace_events.c')
-rw-r--r-- | kernel/trace/trace_events.c | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 1880a6438097..769dfd00fc85 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -102,7 +102,7 @@ static int ftrace_set_clr_event(char *buf, int set) | |||
102 | mutex_lock(&event_mutex); | 102 | mutex_lock(&event_mutex); |
103 | events_for_each(call) { | 103 | events_for_each(call) { |
104 | 104 | ||
105 | if (!call->name) | 105 | if (!call->name || !call->regfunc) |
106 | continue; | 106 | continue; |
107 | 107 | ||
108 | if (match && | 108 | if (match && |
@@ -207,8 +207,20 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
207 | 207 | ||
208 | (*pos)++; | 208 | (*pos)++; |
209 | 209 | ||
210 | if ((unsigned long)call >= (unsigned long)__stop_ftrace_events) | 210 | for (;;) { |
211 | return NULL; | 211 | if ((unsigned long)call >= (unsigned long)__stop_ftrace_events) |
212 | return NULL; | ||
213 | |||
214 | /* | ||
215 | * The ftrace subsystem is for showing formats only. | ||
216 | * They can not be enabled or disabled via the event files. | ||
217 | */ | ||
218 | if (call->regfunc) | ||
219 | break; | ||
220 | |||
221 | call++; | ||
222 | next = call; | ||
223 | } | ||
212 | 224 | ||
213 | m->private = ++next; | 225 | m->private = ++next; |
214 | 226 | ||
@@ -338,8 +350,7 @@ event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt, | |||
338 | 350 | ||
339 | #undef FIELD | 351 | #undef FIELD |
340 | #define FIELD(type, name) \ | 352 | #define FIELD(type, name) \ |
341 | #type, #name, (unsigned int)offsetof(typeof(field), name), \ | 353 | #type, #name, offsetof(typeof(field), name), sizeof(field.name) |
342 | (unsigned int)sizeof(field.name) | ||
343 | 354 | ||
344 | static int trace_write_header(struct trace_seq *s) | 355 | static int trace_write_header(struct trace_seq *s) |
345 | { | 356 | { |
@@ -347,11 +358,11 @@ static int trace_write_header(struct trace_seq *s) | |||
347 | 358 | ||
348 | /* struct trace_entry */ | 359 | /* struct trace_entry */ |
349 | return trace_seq_printf(s, | 360 | return trace_seq_printf(s, |
350 | "\tfield:%s %s;\toffset:%u;\tsize:%u;\n" | 361 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" |
351 | "\tfield:%s %s;\toffset:%u;\tsize:%u;\n" | 362 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" |
352 | "\tfield:%s %s;\toffset:%u;\tsize:%u;\n" | 363 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" |
353 | "\tfield:%s %s;\toffset:%u;\tsize:%u;\n" | 364 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" |
354 | "\tfield:%s %s;\toffset:%u;\tsize:%u;\n" | 365 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" |
355 | "\n", | 366 | "\n", |
356 | FIELD(unsigned char, type), | 367 | FIELD(unsigned char, type), |
357 | FIELD(unsigned char, flags), | 368 | FIELD(unsigned char, flags), |
@@ -417,6 +428,13 @@ static const struct seq_operations show_set_event_seq_ops = { | |||
417 | .stop = t_stop, | 428 | .stop = t_stop, |
418 | }; | 429 | }; |
419 | 430 | ||
431 | static const struct file_operations ftrace_avail_fops = { | ||
432 | .open = ftrace_event_seq_open, | ||
433 | .read = seq_read, | ||
434 | .llseek = seq_lseek, | ||
435 | .release = seq_release, | ||
436 | }; | ||
437 | |||
420 | static const struct file_operations ftrace_set_event_fops = { | 438 | static const struct file_operations ftrace_set_event_fops = { |
421 | .open = ftrace_event_seq_open, | 439 | .open = ftrace_event_seq_open, |
422 | .read = seq_read, | 440 | .read = seq_read, |
@@ -558,6 +576,13 @@ static __init int event_trace_init(void) | |||
558 | if (!d_tracer) | 576 | if (!d_tracer) |
559 | return 0; | 577 | return 0; |
560 | 578 | ||
579 | entry = debugfs_create_file("available_events", 0444, d_tracer, | ||
580 | (void *)&show_event_seq_ops, | ||
581 | &ftrace_avail_fops); | ||
582 | if (!entry) | ||
583 | pr_warning("Could not create debugfs " | ||
584 | "'available_events' entry\n"); | ||
585 | |||
561 | entry = debugfs_create_file("set_event", 0644, d_tracer, | 586 | entry = debugfs_create_file("set_event", 0644, d_tracer, |
562 | (void *)&show_set_event_seq_ops, | 587 | (void *)&show_set_event_seq_ops, |
563 | &ftrace_set_event_fops); | 588 | &ftrace_set_event_fops); |