~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/kernel/trace/trace_events.c

Version: ~ [ linux-5.13-rc5 ] ~ [ linux-5.12.9 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.42 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.124 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.193 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.235 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.271 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.271 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * event tracer
  3  *
  4  * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
  5  *
  6  *  - Added format output of fields of the trace point.
  7  *    This was based off of work by Tom Zanussi <tzanussi@gmail.com>.
  8  *
  9  */
 10 
 11 #define pr_fmt(fmt) fmt
 12 
 13 #include <linux/workqueue.h>
 14 #include <linux/spinlock.h>
 15 #include <linux/kthread.h>
 16 #include <linux/tracefs.h>
 17 #include <linux/uaccess.h>
 18 #include <linux/module.h>
 19 #include <linux/ctype.h>
 20 #include <linux/slab.h>
 21 #include <linux/delay.h>
 22 
 23 #include <asm/setup.h>
 24 
 25 #include "trace_output.h"
 26 
 27 #undef TRACE_SYSTEM
 28 #define TRACE_SYSTEM "TRACE_SYSTEM"
 29 
 30 DEFINE_MUTEX(event_mutex);
 31 
 32 LIST_HEAD(ftrace_events);
 33 static LIST_HEAD(ftrace_generic_fields);
 34 static LIST_HEAD(ftrace_common_fields);
 35 
 36 #define GFP_TRACE (GFP_KERNEL | __GFP_ZERO)
 37 
 38 static struct kmem_cache *field_cachep;
 39 static struct kmem_cache *file_cachep;
 40 
 41 #define SYSTEM_FL_FREE_NAME             (1 << 31)
 42 
 43 static inline int system_refcount(struct event_subsystem *system)
 44 {
 45         return system->ref_count & ~SYSTEM_FL_FREE_NAME;
 46 }
 47 
 48 static int system_refcount_inc(struct event_subsystem *system)
 49 {
 50         return (system->ref_count++) & ~SYSTEM_FL_FREE_NAME;
 51 }
 52 
 53 static int system_refcount_dec(struct event_subsystem *system)
 54 {
 55         return (--system->ref_count) & ~SYSTEM_FL_FREE_NAME;
 56 }
 57 
 58 /* Double loops, do not use break, only goto's work */
 59 #define do_for_each_event_file(tr, file)                        \
 60         list_for_each_entry(tr, &ftrace_trace_arrays, list) {   \
 61                 list_for_each_entry(file, &tr->events, list)
 62 
 63 #define do_for_each_event_file_safe(tr, file)                   \
 64         list_for_each_entry(tr, &ftrace_trace_arrays, list) {   \
 65                 struct trace_event_file *___n;                          \
 66                 list_for_each_entry_safe(file, ___n, &tr->events, list)
 67 
 68 #define while_for_each_event_file()             \
 69         }
 70 
 71 static struct list_head *
 72 trace_get_fields(struct trace_event_call *event_call)
 73 {
 74         if (!event_call->class->get_fields)
 75                 return &event_call->class->fields;
 76         return event_call->class->get_fields(event_call);
 77 }
 78 
 79 static struct ftrace_event_field *
 80 __find_event_field(struct list_head *head, char *name)
 81 {
 82         struct ftrace_event_field *field;
 83 
 84         list_for_each_entry(field, head, link) {
 85                 if (!strcmp(field->name, name))
 86                         return field;
 87         }
 88 
 89         return NULL;
 90 }
 91 
 92 struct ftrace_event_field *
 93 trace_find_event_field(struct trace_event_call *call, char *name)
 94 {
 95         struct ftrace_event_field *field;
 96         struct list_head *head;
 97 
 98         field = __find_event_field(&ftrace_generic_fields, name);
 99         if (field)
100                 return field;
101 
102         field = __find_event_field(&ftrace_common_fields, name);
103         if (field)
104                 return field;
105 
106         head = trace_get_fields(call);
107         return __find_event_field(head, name);
108 }
109 
110 static int __trace_define_field(struct list_head *head, const char *type,
111                                 const char *name, int offset, int size,
112                                 int is_signed, int filter_type)
113 {
114         struct ftrace_event_field *field;
115 
116         field = kmem_cache_alloc(field_cachep, GFP_TRACE);
117         if (!field)
118                 return -ENOMEM;
119 
120         field->name = name;
121         field->type = type;
122 
123         if (filter_type == FILTER_OTHER)
124                 field->filter_type = filter_assign_type(type);
125         else
126                 field->filter_type = filter_type;
127 
128         field->offset = offset;
129         field->size = size;
130         field->is_signed = is_signed;
131 
132         list_add(&field->link, head);
133 
134         return 0;
135 }
136 
137 int trace_define_field(struct trace_event_call *call, const char *type,
138                        const char *name, int offset, int size, int is_signed,
139                        int filter_type)
140 {
141         struct list_head *head;
142 
143         if (WARN_ON(!call->class))
144                 return 0;
145 
146         head = trace_get_fields(call);
147         return __trace_define_field(head, type, name, offset, size,
148                                     is_signed, filter_type);
149 }
150 EXPORT_SYMBOL_GPL(trace_define_field);
151 
152 #define __generic_field(type, item, filter_type)                        \
153         ret = __trace_define_field(&ftrace_generic_fields, #type,       \
154                                    #item, 0, 0, is_signed_type(type),   \
155                                    filter_type);                        \
156         if (ret)                                                        \
157                 return ret;
158 
159 #define __common_field(type, item)                                      \
160         ret = __trace_define_field(&ftrace_common_fields, #type,        \
161                                    "common_" #item,                     \
162                                    offsetof(typeof(ent), item),         \
163                                    sizeof(ent.item),                    \
164                                    is_signed_type(type), FILTER_OTHER); \
165         if (ret)                                                        \
166                 return ret;
167 
168 static int trace_define_generic_fields(void)
169 {
170         int ret;
171 
172         __generic_field(int, cpu, FILTER_OTHER);
173         __generic_field(char *, comm, FILTER_PTR_STRING);
174 
175         return ret;
176 }
177 
178 static int trace_define_common_fields(void)
179 {
180         int ret;
181         struct trace_entry ent;
182 
183         __common_field(unsigned short, type);
184         __common_field(unsigned char, flags);
185         __common_field(unsigned char, preempt_count);
186         __common_field(int, pid);
187 
188         return ret;
189 }
190 
191 static void trace_destroy_fields(struct trace_event_call *call)
192 {
193         struct ftrace_event_field *field, *next;
194         struct list_head *head;
195 
196         head = trace_get_fields(call);
197         list_for_each_entry_safe(field, next, head, link) {
198                 list_del(&field->link);
199                 kmem_cache_free(field_cachep, field);
200         }
201 }
202 
203 int trace_event_raw_init(struct trace_event_call *call)
204 {
205         int id;
206 
207         id = register_trace_event(&call->event);
208         if (!id)
209                 return -ENODEV;
210 
211         return 0;
212 }
213 EXPORT_SYMBOL_GPL(trace_event_raw_init);
214 
215 void *trace_event_buffer_reserve(struct trace_event_buffer *fbuffer,
216                                  struct trace_event_file *trace_file,
217                                  unsigned long len)
218 {
219         struct trace_event_call *event_call = trace_file->event_call;
220 
221         local_save_flags(fbuffer->flags);
222         fbuffer->pc = preempt_count();
223         fbuffer->trace_file = trace_file;
224 
225         fbuffer->event =
226                 trace_event_buffer_lock_reserve(&fbuffer->buffer, trace_file,
227                                                 event_call->event.type, len,
228                                                 fbuffer->flags, fbuffer->pc);
229         if (!fbuffer->event)
230                 return NULL;
231 
232         fbuffer->entry = ring_buffer_event_data(fbuffer->event);
233         return fbuffer->entry;
234 }
235 EXPORT_SYMBOL_GPL(trace_event_buffer_reserve);
236 
237 static DEFINE_SPINLOCK(tracepoint_iter_lock);
238 
239 static void output_printk(struct trace_event_buffer *fbuffer)
240 {
241         struct trace_event_call *event_call;
242         struct trace_event *event;
243         unsigned long flags;
244         struct trace_iterator *iter = tracepoint_print_iter;
245 
246         if (!iter)
247                 return;
248 
249         event_call = fbuffer->trace_file->event_call;
250         if (!event_call || !event_call->event.funcs ||
251             !event_call->event.funcs->trace)
252                 return;
253 
254         event = &fbuffer->trace_file->event_call->event;
255 
256         spin_lock_irqsave(&tracepoint_iter_lock, flags);
257         trace_seq_init(&iter->seq);
258         iter->ent = fbuffer->entry;
259         event_call->event.funcs->trace(iter, 0, event);
260         trace_seq_putc(&iter->seq, 0);
261         printk("%s", iter->seq.buffer);
262 
263         spin_unlock_irqrestore(&tracepoint_iter_lock, flags);
264 }
265 
266 void trace_event_buffer_commit(struct trace_event_buffer *fbuffer)
267 {
268         if (tracepoint_printk)
269                 output_printk(fbuffer);
270 
271         event_trigger_unlock_commit(fbuffer->trace_file, fbuffer->buffer,
272                                     fbuffer->event, fbuffer->entry,
273                                     fbuffer->flags, fbuffer->pc);
274 }
275 EXPORT_SYMBOL_GPL(trace_event_buffer_commit);
276 
277 int trace_event_reg(struct trace_event_call *call,
278                     enum trace_reg type, void *data)
279 {
280         struct trace_event_file *file = data;
281 
282         WARN_ON(!(call->flags & TRACE_EVENT_FL_TRACEPOINT));
283         switch (type) {
284         case TRACE_REG_REGISTER:
285                 return tracepoint_probe_register(call->tp,
286                                                  call->class->probe,
287                                                  file);
288         case TRACE_REG_UNREGISTER:
289                 tracepoint_probe_unregister(call->tp,
290                                             call->class->probe,
291                                             file);
292                 return 0;
293 
294 #ifdef CONFIG_PERF_EVENTS
295         case TRACE_REG_PERF_REGISTER:
296                 return tracepoint_probe_register(call->tp,
297                                                  call->class->perf_probe,
298                                                  call);
299         case TRACE_REG_PERF_UNREGISTER:
300                 tracepoint_probe_unregister(call->tp,
301                                             call->class->perf_probe,
302                                             call);
303                 return 0;
304         case TRACE_REG_PERF_OPEN:
305         case TRACE_REG_PERF_CLOSE:
306         case TRACE_REG_PERF_ADD:
307         case TRACE_REG_PERF_DEL:
308                 return 0;
309 #endif
310         }
311         return 0;
312 }
313 EXPORT_SYMBOL_GPL(trace_event_reg);
314 
315 void trace_event_enable_cmd_record(bool enable)
316 {
317         struct trace_event_file *file;
318         struct trace_array *tr;
319 
320         mutex_lock(&event_mutex);
321         do_for_each_event_file(tr, file) {
322 
323                 if (!(file->flags & EVENT_FILE_FL_ENABLED))
324                         continue;
325 
326                 if (enable) {
327                         tracing_start_cmdline_record();
328                         set_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags);
329                 } else {
330                         tracing_stop_cmdline_record();
331                         clear_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags);
332                 }
333         } while_for_each_event_file();
334         mutex_unlock(&event_mutex);
335 }
336 
337 static int __ftrace_event_enable_disable(struct trace_event_file *file,
338                                          int enable, int soft_disable)
339 {
340         struct trace_event_call *call = file->event_call;
341         int ret = 0;
342         int disable;
343 
344         switch (enable) {
345         case 0:
346                 /*
347                  * When soft_disable is set and enable is cleared, the sm_ref
348                  * reference counter is decremented. If it reaches 0, we want
349                  * to clear the SOFT_DISABLED flag but leave the event in the
350                  * state that it was. That is, if the event was enabled and
351                  * SOFT_DISABLED isn't set, then do nothing. But if SOFT_DISABLED
352                  * is set we do not want the event to be enabled before we
353                  * clear the bit.
354                  *
355                  * When soft_disable is not set but the SOFT_MODE flag is,
356                  * we do nothing. Do not disable the tracepoint, otherwise
357                  * "soft enable"s (clearing the SOFT_DISABLED bit) wont work.
358                  */
359                 if (soft_disable) {
360                         if (atomic_dec_return(&file->sm_ref) > 0)
361                                 break;
362                         disable = file->flags & EVENT_FILE_FL_SOFT_DISABLED;
363                         clear_bit(EVENT_FILE_FL_SOFT_MODE_BIT, &file->flags);
364                 } else
365                         disable = !(file->flags & EVENT_FILE_FL_SOFT_MODE);
366 
367                 if (disable && (file->flags & EVENT_FILE_FL_ENABLED)) {
368                         clear_bit(EVENT_FILE_FL_ENABLED_BIT, &file->flags);
369                         if (file->flags & EVENT_FILE_FL_RECORDED_CMD) {
370                                 tracing_stop_cmdline_record();
371                                 clear_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags);
372                         }
373                         call->class->reg(call, TRACE_REG_UNREGISTER, file);
374                 }
375                 /* If in SOFT_MODE, just set the SOFT_DISABLE_BIT, else clear it */
376                 if (file->flags & EVENT_FILE_FL_SOFT_MODE)
377                         set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags);
378                 else
379                         clear_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags);
380                 break;
381         case 1:
382                 /*
383                  * When soft_disable is set and enable is set, we want to
384                  * register the tracepoint for the event, but leave the event
385                  * as is. That means, if the event was already enabled, we do
386                  * nothing (but set SOFT_MODE). If the event is disabled, we
387                  * set SOFT_DISABLED before enabling the event tracepoint, so
388                  * it still seems to be disabled.
389                  */
390                 if (!soft_disable)
391                         clear_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags);
392                 else {
393                         if (atomic_inc_return(&file->sm_ref) > 1)
394                                 break;
395                         set_bit(EVENT_FILE_FL_SOFT_MODE_BIT, &file->flags);
396                 }
397 
398                 if (!(file->flags & EVENT_FILE_FL_ENABLED)) {
399 
400                         /* Keep the event disabled, when going to SOFT_MODE. */
401                         if (soft_disable)
402                                 set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags);
403 
404                         if (trace_flags & TRACE_ITER_RECORD_CMD) {
405                                 tracing_start_cmdline_record();
406                                 set_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags);
407                         }
408                         ret = call->class->reg(call, TRACE_REG_REGISTER, file);
409                         if (ret) {
410                                 tracing_stop_cmdline_record();
411                                 pr_info("event trace: Could not enable event "
412                                         "%s\n", trace_event_name(call));
413                                 break;
414                         }
415                         set_bit(EVENT_FILE_FL_ENABLED_BIT, &file->flags);
416 
417                         /* WAS_ENABLED gets set but never cleared. */
418                         call->flags |= TRACE_EVENT_FL_WAS_ENABLED;
419                 }
420                 break;
421         }
422 
423         return ret;
424 }
425 
426 int trace_event_enable_disable(struct trace_event_file *file,
427                                int enable, int soft_disable)
428 {
429         return __ftrace_event_enable_disable(file, enable, soft_disable);
430 }
431 
432 static int ftrace_event_enable_disable(struct trace_event_file *file,
433                                        int enable)
434 {
435         return __ftrace_event_enable_disable(file, enable, 0);
436 }
437 
438 static void ftrace_clear_events(struct trace_array *tr)
439 {
440         struct trace_event_file *file;
441 
442         mutex_lock(&event_mutex);
443         list_for_each_entry(file, &tr->events, list) {
444                 ftrace_event_enable_disable(file, 0);
445         }
446         mutex_unlock(&event_mutex);
447 }
448 
449 static void __put_system(struct event_subsystem *system)
450 {
451         struct event_filter *filter = system->filter;
452 
453         WARN_ON_ONCE(system_refcount(system) == 0);
454         if (system_refcount_dec(system))
455                 return;
456 
457         list_del(&system->list);
458 
459         if (filter) {
460                 kfree(filter->filter_string);
461                 kfree(filter);
462         }
463         if (system->ref_count & SYSTEM_FL_FREE_NAME)
464                 kfree(system->name);
465         kfree(system);
466 }
467 
468 static void __get_system(struct event_subsystem *system)
469 {
470         WARN_ON_ONCE(system_refcount(system) == 0);
471         system_refcount_inc(system);
472 }
473 
474 static void __get_system_dir(struct trace_subsystem_dir *dir)
475 {
476         WARN_ON_ONCE(dir->ref_count == 0);
477         dir->ref_count++;
478         __get_system(dir->subsystem);
479 }
480 
481 static void __put_system_dir(struct trace_subsystem_dir *dir)
482 {
483         WARN_ON_ONCE(dir->ref_count == 0);
484         /* If the subsystem is about to be freed, the dir must be too */
485         WARN_ON_ONCE(system_refcount(dir->subsystem) == 1 && dir->ref_count != 1);
486 
487         __put_system(dir->subsystem);
488         if (!--dir->ref_count)
489                 kfree(dir);
490 }
491 
492 static void put_system(struct trace_subsystem_dir *dir)
493 {
494         mutex_lock(&event_mutex);
495         __put_system_dir(dir);
496         mutex_unlock(&event_mutex);
497 }
498 
499 static void remove_subsystem(struct trace_subsystem_dir *dir)
500 {
501         if (!dir)
502                 return;
503 
504         if (!--dir->nr_events) {
505                 tracefs_remove_recursive(dir->entry);
506                 list_del(&dir->list);
507                 __put_system_dir(dir);
508         }
509 }
510 
511 static void remove_event_file_dir(struct trace_event_file *file)
512 {
513         struct dentry *dir = file->dir;
514         struct dentry *child;
515 
516         if (dir) {
517                 spin_lock(&dir->d_lock);        /* probably unneeded */
518                 list_for_each_entry(child, &dir->d_subdirs, d_child) {
519                         if (d_really_is_positive(child))        /* probably unneeded */
520                                 d_inode(child)->i_private = NULL;
521                 }
522                 spin_unlock(&dir->d_lock);
523 
524                 tracefs_remove_recursive(dir);
525         }
526 
527         list_del(&file->list);
528         remove_subsystem(file->system);
529         free_event_filter(file->filter);
530         kmem_cache_free(file_cachep, file);
531 }
532 
533 /*
534  * __ftrace_set_clr_event(NULL, NULL, NULL, set) will set/unset all events.
535  */
536 static int
537 __ftrace_set_clr_event_nolock(struct trace_array *tr, const char *match,
538                               const char *sub, const char *event, int set)
539 {
540         struct trace_event_file *file;
541         struct trace_event_call *call;
542         const char *name;
543         int ret = -EINVAL;
544 
545         list_for_each_entry(file, &tr->events, list) {
546 
547                 call = file->event_call;
548                 name = trace_event_name(call);
549 
550                 if (!name || !call->class || !call->class->reg)
551                         continue;
552 
553                 if (call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)
554                         continue;
555 
556                 if (match &&
557                     strcmp(match, name) != 0 &&
558                     strcmp(match, call->class->system) != 0)
559                         continue;
560 
561                 if (sub && strcmp(sub, call->class->system) != 0)
562                         continue;
563 
564                 if (event && strcmp(event, name) != 0)
565                         continue;
566 
567                 ftrace_event_enable_disable(file, set);
568 
569                 ret = 0;
570         }
571 
572         return ret;
573 }
574 
575 static int __ftrace_set_clr_event(struct trace_array *tr, const char *match,
576                                   const char *sub, const char *event, int set)
577 {
578         int ret;
579 
580         mutex_lock(&event_mutex);
581         ret = __ftrace_set_clr_event_nolock(tr, match, sub, event, set);
582         mutex_unlock(&event_mutex);
583 
584         return ret;
585 }
586 
587 static int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set)
588 {
589         char *event = NULL, *sub = NULL, *match;
590         int ret;
591 
592         /*
593          * The buf format can be <subsystem>:<event-name>
594          *  *:<event-name> means any event by that name.
595          *  :<event-name> is the same.
596          *
597          *  <subsystem>:* means all events in that subsystem
598          *  <subsystem>: means the same.
599          *
600          *  <name> (no ':') means all events in a subsystem with
601          *  the name <name> or any event that matches <name>
602          */
603 
604         match = strsep(&buf, ":");
605         if (buf) {
606                 sub = match;
607                 event = buf;
608                 match = NULL;
609 
610                 if (!strlen(sub) || strcmp(sub, "*") == 0)
611                         sub = NULL;
612                 if (!strlen(event) || strcmp(event, "*") == 0)
613                         event = NULL;
614         }
615 
616         ret = __ftrace_set_clr_event(tr, match, sub, event, set);
617 
618         /* Put back the colon to allow this to be called again */
619         if (buf)
620                 *(buf - 1) = ':';
621 
622         return ret;
623 }
624 
625 /**
626  * trace_set_clr_event - enable or disable an event
627  * @system: system name to match (NULL for any system)
628  * @event: event name to match (NULL for all events, within system)
629  * @set: 1 to enable, 0 to disable
630  *
631  * This is a way for other parts of the kernel to enable or disable
632  * event recording.
633  *
634  * Returns 0 on success, -EINVAL if the parameters do not match any
635  * registered events.
636  */
637 int trace_set_clr_event(const char *system, const char *event, int set)
638 {
639         struct trace_array *tr = top_trace_array();
640 
641         if (!tr)
642                 return -ENODEV;
643 
644         return __ftrace_set_clr_event(tr, NULL, system, event, set);
645 }
646 EXPORT_SYMBOL_GPL(trace_set_clr_event);
647 
648 /* 128 should be much more than enough */
649 #define EVENT_BUF_SIZE          127
650 
651 static ssize_t
652 ftrace_event_write(struct file *file, const char __user *ubuf,
653                    size_t cnt, loff_t *ppos)
654 {
655         struct trace_parser parser;
656         struct seq_file *m = file->private_data;
657         struct trace_array *tr = m->private;
658         ssize_t read, ret;
659 
660         if (!cnt)
661                 return 0;
662 
663         ret = tracing_update_buffers();
664         if (ret < 0)
665                 return ret;
666 
667         if (trace_parser_get_init(&parser, EVENT_BUF_SIZE + 1))
668                 return -ENOMEM;
669 
670         read = trace_get_user(&parser, ubuf, cnt, ppos);
671 
672         if (read >= 0 && trace_parser_loaded((&parser))) {
673                 int set = 1;
674 
675                 if (*parser.buffer == '!')
676                         set = 0;
677 
678                 parser.buffer[parser.idx] = 0;
679 
680                 ret = ftrace_set_clr_event(tr, parser.buffer + !set, set);
681                 if (ret)
682                         goto out_put;
683         }
684 
685         ret = read;
686 
687  out_put:
688         trace_parser_put(&parser);
689 
690         return ret;
691 }
692 
693 static void *
694 t_next(struct seq_file *m, void *v, loff_t *pos)
695 {
696         struct trace_event_file *file = v;
697         struct trace_event_call *call;
698         struct trace_array *tr = m->private;
699 
700         (*pos)++;
701 
702         list_for_each_entry_continue(file, &tr->events, list) {
703                 call = file->event_call;
704                 /*
705                  * The ftrace subsystem is for showing formats only.
706                  * They can not be enabled or disabled via the event files.
707                  */
708                 if (call->class && call->class->reg)
709                         return file;
710         }
711 
712         return NULL;
713 }
714 
715 static void *t_start(struct seq_file *m, loff_t *pos)
716 {
717         struct trace_event_file *file;
718         struct trace_array *tr = m->private;
719         loff_t l;
720 
721         mutex_lock(&event_mutex);
722 
723         file = list_entry(&tr->events, struct trace_event_file, list);
724         for (l = 0; l <= *pos; ) {
725                 file = t_next(m, file, &l);
726                 if (!file)
727                         break;
728         }
729         return file;
730 }
731 
732 static void *
733 s_next(struct seq_file *m, void *v, loff_t *pos)
734 {
735         struct trace_event_file *file = v;
736         struct trace_array *tr = m->private;
737 
738         (*pos)++;
739 
740         list_for_each_entry_continue(file, &tr->events, list) {
741                 if (file->flags & EVENT_FILE_FL_ENABLED)
742                         return file;
743         }
744 
745         return NULL;
746 }
747 
748 static void *s_start(struct seq_file *m, loff_t *pos)
749 {
750         struct trace_event_file *file;
751         struct trace_array *tr = m->private;
752         loff_t l;
753 
754         mutex_lock(&event_mutex);
755 
756         file = list_entry(&tr->events, struct trace_event_file, list);
757         for (l = 0; l <= *pos; ) {
758                 file = s_next(m, file, &l);
759                 if (!file)
760                         break;
761         }
762         return file;
763 }
764 
765 static int t_show(struct seq_file *m, void *v)
766 {
767         struct trace_event_file *file = v;
768         struct trace_event_call *call = file->event_call;
769 
770         if (strcmp(call->class->system, TRACE_SYSTEM) != 0)
771                 seq_printf(m, "%s:", call->class->system);
772         seq_printf(m, "%s\n", trace_event_name(call));
773 
774         return 0;
775 }
776 
777 static void t_stop(struct seq_file *m, void *p)
778 {
779         mutex_unlock(&event_mutex);
780 }
781 
782 static ssize_t
783 event_enable_read(struct file *filp, char __user *ubuf, size_t cnt,
784                   loff_t *ppos)
785 {
786         struct trace_event_file *file;
787         unsigned long flags;
788         char buf[4] = "";
789 
790         mutex_lock(&event_mutex);
791         file = event_file_data(filp);
792         if (likely(file))
793                 flags = file->flags;
794         mutex_unlock(&event_mutex);
795 
796         if (!file)
797                 return -ENODEV;
798 
799         if (flags & EVENT_FILE_FL_ENABLED &&
800             !(flags & EVENT_FILE_FL_SOFT_DISABLED))
801                 strcpy(buf, "1");
802 
803         if (flags & EVENT_FILE_FL_SOFT_DISABLED ||
804             flags & EVENT_FILE_FL_SOFT_MODE)
805                 strcat(buf, "*");
806 
807         strcat(buf, "\n");
808 
809         return simple_read_from_buffer(ubuf, cnt, ppos, buf, strlen(buf));
810 }
811 
812 static ssize_t
813 event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt,
814                    loff_t *ppos)
815 {
816         struct trace_event_file *file;
817         unsigned long val;
818         int ret;
819 
820         ret = kstrtoul_from_user(ubuf, cnt, 10, &val);
821         if (ret)
822                 return ret;
823 
824         ret = tracing_update_buffers();
825         if (ret < 0)
826                 return ret;
827 
828         switch (val) {
829         case 0:
830         case 1:
831                 ret = -ENODEV;
832                 mutex_lock(&event_mutex);
833                 file = event_file_data(filp);
834                 if (likely(file))
835                         ret = ftrace_event_enable_disable(file, val);
836                 mutex_unlock(&event_mutex);
837                 break;
838 
839         default:
840                 return -EINVAL;
841         }
842 
843         *ppos += cnt;
844 
845         return ret ? ret : cnt;
846 }
847 
848 static ssize_t
849 system_enable_read(struct file *filp, char __user *ubuf, size_t cnt,
850                    loff_t *ppos)
851 {
852         const char set_to_char[4] = { '?', '', '1', 'X' };
853         struct trace_subsystem_dir *dir = filp->private_data;
854         struct event_subsystem *system = dir->subsystem;
855         struct trace_event_call *call;
856         struct trace_event_file *file;
857         struct trace_array *tr = dir->tr;
858         char buf[2];
859         int set = 0;
860         int ret;
861 
862         mutex_lock(&event_mutex);
863         list_for_each_entry(file, &tr->events, list) {
864                 call = file->event_call;
865                 if (!trace_event_name(call) || !call->class || !call->class->reg)
866                         continue;
867 
868                 if (system && strcmp(call->class->system, system->name) != 0)
869                         continue;
870 
871                 /*
872                  * We need to find out if all the events are set
873                  * or if all events or cleared, or if we have
874                  * a mixture.
875                  */
876                 set |= (1 << !!(file->flags & EVENT_FILE_FL_ENABLED));
877 
878                 /*
879                  * If we have a mixture, no need to look further.
880                  */
881                 if (set == 3)
882                         break;
883         }
884         mutex_unlock(&event_mutex);
885 
886         buf[0] = set_to_char[set];
887         buf[1] = '\n';
888 
889         ret = simple_read_from_buffer(ubuf, cnt, ppos, buf, 2);
890 
891         return ret;
892 }
893 
894 static ssize_t
895 system_enable_write(struct file *filp, const char __user *ubuf, size_t cnt,
896                     loff_t *ppos)
897 {
898         struct trace_subsystem_dir *dir = filp->private_data;
899         struct event_subsystem *system = dir->subsystem;
900         const char *name = NULL;
901         unsigned long val;
902         ssize_t ret;
903 
904         ret = kstrtoul_from_user(ubuf, cnt, 10, &val);
905         if (ret)
906                 return ret;
907 
908         ret = tracing_update_buffers();
909         if (ret < 0)
910                 return ret;
911 
912         if (val != 0 && val != 1)
913                 return -EINVAL;
914 
915         /*
916          * Opening of "enable" adds a ref count to system,
917          * so the name is safe to use.
918          */
919         if (system)
920                 name = system->name;
921 
922         ret = __ftrace_set_clr_event(dir->tr, NULL, name, NULL, val);
923         if (ret)
924                 goto out;
925 
926         ret = cnt;
927 
928 out:
929         *ppos += cnt;
930 
931         return ret;
932 }
933 
934 enum {
935         FORMAT_HEADER           = 1,
936         FORMAT_FIELD_SEPERATOR  = 2,
937         FORMAT_PRINTFMT         = 3,
938 };
939 
940 static void *f_next(struct seq_file *m, void *v, loff_t *pos)
941 {
942         struct trace_event_call *call = event_file_data(m->private);
943         struct list_head *common_head = &ftrace_common_fields;
944         struct list_head *head = trace_get_fields(call);
945         struct list_head *node = v;
946 
947         (*pos)++;
948 
949         switch ((unsigned long)v) {
950         case FORMAT_HEADER:
951                 node = common_head;
952                 break;
953 
954         case FORMAT_FIELD_SEPERATOR:
955                 node = head;
956                 break;
957 
958         case FORMAT_PRINTFMT:
959                 /* all done */
960                 return NULL;
961         }
962 
963         node = node->prev;
964         if (node == common_head)
965                 return (void *)FORMAT_FIELD_SEPERATOR;
966         else if (node == head)
967                 return (void *)FORMAT_PRINTFMT;
968         else
969                 return node;
970 }
971 
972 static int f_show(struct seq_file *m, void *v)
973 {
974         struct trace_event_call *call = event_file_data(m->private);
975         struct ftrace_event_field *field;
976         const char *array_descriptor;
977 
978         switch ((unsigned long)v) {
979         case FORMAT_HEADER:
980                 seq_printf(m, "name: %s\n", trace_event_name(call));
981                 seq_printf(m, "ID: %d\n", call->event.type);
982                 seq_puts(m, "format:\n");
983                 return 0;
984 
985         case FORMAT_FIELD_SEPERATOR:
986                 seq_putc(m, '\n');
987                 return 0;
988 
989         case FORMAT_PRINTFMT:
990                 seq_printf(m, "\nprint fmt: %s\n",
991                            call->print_fmt);
992                 return 0;
993         }
994 
995         field = list_entry(v, struct ftrace_event_field, link);
996         /*
997          * Smartly shows the array type(except dynamic array).
998          * Normal:
999          *      field:TYPE VAR
1000          * If TYPE := TYPE[LEN], it is shown:
1001          *      field:TYPE VAR[LEN]
1002          */
1003         array_descriptor = strchr(field->type, '[');
1004 
1005         if (!strncmp(field->type, "__data_loc", 10))
1006                 array_descriptor = NULL;
1007 
1008         if (!array_descriptor)
1009                 seq_printf(m, "\tfield:%s %s;\toffset:%u;\tsize:%u;\tsigned:%d;\n",
1010                            field->type, field->name, field->offset,
1011                            field->size, !!field->is_signed);
1012         else
1013                 seq_printf(m, "\tfield:%.*s %s%s;\toffset:%u;\tsize:%u;\tsigned:%d;\n",
1014                            (int)(array_descriptor - field->type),
1015                            field->type, field->name,
1016                            array_descriptor, field->offset,
1017                            field->size, !!field->is_signed);
1018 
1019         return 0;
1020 }
1021 
1022 static void *f_start(struct seq_file *m, loff_t *pos)
1023 {
1024         void *p = (void *)FORMAT_HEADER;
1025         loff_t l = 0;
1026 
1027         /* ->stop() is called even if ->start() fails */
1028         mutex_lock(&event_mutex);
1029         if (!event_file_data(m->private))
1030                 return ERR_PTR(-ENODEV);
1031 
1032         while (l < *pos && p)
1033                 p = f_next(m, p, &l);
1034 
1035         return p;
1036 }
1037 
1038 static void f_stop(struct seq_file *m, void *p)
1039 {
1040         mutex_unlock(&event_mutex);
1041 }
1042 
1043 static const struct seq_operations trace_format_seq_ops = {
1044         .start          = f_start,
1045         .next           = f_next,
1046         .stop           = f_stop,
1047         .show           = f_show,
1048 };
1049 
1050 static int trace_format_open(struct inode *inode, struct file *file)
1051 {
1052         struct seq_file *m;
1053         int ret;
1054 
1055         ret = seq_open(file, &trace_format_seq_ops);
1056         if (ret < 0)
1057                 return ret;
1058 
1059         m = file->private_data;
1060         m->private = file;
1061 
1062         return 0;
1063 }
1064 
1065 static ssize_t
1066 event_id_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos)
1067 {
1068         int id = (long)event_file_data(filp);
1069         char buf[32];
1070         int len;
1071 
1072         if (*ppos)
1073                 return 0;
1074 
1075         if (unlikely(!id))
1076                 return -ENODEV;
1077 
1078         len = sprintf(buf, "%d\n", id);
1079 
1080         return simple_read_from_buffer(ubuf, cnt, ppos, buf, len);
1081 }
1082 
1083 static ssize_t
1084 event_filter_read(struct file *filp, char __user *ubuf, size_t cnt,
1085                   loff_t *ppos)
1086 {
1087         struct trace_event_file *file;
1088         struct trace_seq *s;
1089         int r = -ENODEV;
1090 
1091         if (*ppos)
1092                 return 0;
1093 
1094         s = kmalloc(sizeof(*s), GFP_KERNEL);
1095 
1096         if (!s)
1097                 return -ENOMEM;
1098 
1099         trace_seq_init(s);
1100 
1101         mutex_lock(&event_mutex);
1102         file = event_file_data(filp);
1103         if (file)
1104                 print_event_filter(file, s);
1105         mutex_unlock(&event_mutex);
1106 
1107         if (file)
1108                 r = simple_read_from_buffer(ubuf, cnt, ppos,
1109                                             s->buffer, trace_seq_used(s));
1110 
1111         kfree(s);
1112 
1113         return r;
1114 }
1115 
1116 static ssize_t
1117 event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt,
1118                    loff_t *ppos)
1119 {
1120         struct trace_event_file *file;
1121         char *buf;
1122         int err = -ENODEV;
1123 
1124         if (cnt >= PAGE_SIZE)
1125                 return -EINVAL;
1126 
1127         buf = (char *)__get_free_page(GFP_TEMPORARY);
1128         if (!buf)
1129                 return -ENOMEM;
1130 
1131         if (copy_from_user(buf, ubuf, cnt)) {
1132                 free_page((unsigned long) buf);
1133                 return -EFAULT;
1134         }
1135         buf[cnt] = '\0';
1136 
1137         mutex_lock(&event_mutex);
1138         file = event_file_data(filp);
1139         if (file)
1140                 err = apply_event_filter(file, buf);
1141         mutex_unlock(&event_mutex);
1142 
1143         free_page((unsigned long) buf);
1144         if (err < 0)
1145                 return err;
1146 
1147         *ppos += cnt;
1148 
1149         return cnt;
1150 }
1151 
1152 static LIST_HEAD(event_subsystems);
1153 
1154 static int subsystem_open(struct inode *inode, struct file *filp)
1155 {
1156         struct event_subsystem *system = NULL;
1157         struct trace_subsystem_dir *dir = NULL; /* Initialize for gcc */
1158         struct trace_array *tr;
1159         int ret;
1160 
1161         if (tracing_is_disabled())
1162                 return -ENODEV;
1163 
1164         /* Make sure the system still exists */
1165         mutex_lock(&trace_types_lock);
1166         mutex_lock(&event_mutex);
1167         list_for_each_entry(tr, &ftrace_trace_arrays, list) {
1168                 list_for_each_entry(dir, &tr->systems, list) {
1169                         if (dir == inode->i_private) {
1170                                 /* Don't open systems with no events */
1171                                 if (dir->nr_events) {
1172                                         __get_system_dir(dir);
1173                                         system = dir->subsystem;
1174                                 }
1175                                 goto exit_loop;
1176                         }
1177                 }
1178         }
1179  exit_loop:
1180         mutex_unlock(&event_mutex);
1181         mutex_unlock(&trace_types_lock);
1182 
1183         if (!system)
1184                 return -ENODEV;
1185 
1186         /* Some versions of gcc think dir can be uninitialized here */
1187         WARN_ON(!dir);
1188 
1189         /* Still need to increment the ref count of the system */
1190         if (trace_array_get(tr) < 0) {
1191                 put_system(dir);
1192                 return -ENODEV;
1193         }
1194 
1195         ret = tracing_open_generic(inode, filp);
1196         if (ret < 0) {
1197                 trace_array_put(tr);
1198                 put_system(dir);
1199         }
1200 
1201         return ret;
1202 }
1203 
1204 static int system_tr_open(struct inode *inode, struct file *filp)
1205 {
1206         struct trace_subsystem_dir *dir;
1207         struct trace_array *tr = inode->i_private;
1208         int ret;
1209 
1210         if (tracing_is_disabled())
1211                 return -ENODEV;
1212 
1213         if (trace_array_get(tr) < 0)
1214                 return -ENODEV;
1215 
1216         /* Make a temporary dir that has no system but points to tr */
1217         dir = kzalloc(sizeof(*dir), GFP_KERNEL);
1218         if (!dir) {
1219                 trace_array_put(tr);
1220                 return -ENOMEM;
1221         }
1222 
1223         dir->tr = tr;
1224 
1225         ret = tracing_open_generic(inode, filp);
1226         if (ret < 0) {
1227                 trace_array_put(tr);
1228                 kfree(dir);
1229                 return ret;
1230         }
1231 
1232         filp->private_data = dir;
1233 
1234         return 0;
1235 }
1236 
1237 static int subsystem_release(struct inode *inode, struct file *file)
1238 {
1239         struct trace_subsystem_dir *dir = file->private_data;
1240 
1241         trace_array_put(dir->tr);
1242 
1243         /*
1244          * If dir->subsystem is NULL, then this is a temporary
1245          * descriptor that was made for a trace_array to enable
1246          * all subsystems.
1247          */
1248         if (dir->subsystem)
1249                 put_system(dir);
1250         else
1251                 kfree(dir);
1252 
1253         return 0;
1254 }
1255 
1256 static ssize_t
1257 subsystem_filter_read(struct file *filp, char __user *ubuf, size_t cnt,
1258                       loff_t *ppos)
1259 {
1260         struct trace_subsystem_dir *dir = filp->private_data;
1261         struct event_subsystem *system = dir->subsystem;
1262         struct trace_seq *s;
1263         int r;
1264 
1265         if (*ppos)
1266                 return 0;
1267 
1268         s = kmalloc(sizeof(*s), GFP_KERNEL);
1269         if (!s)
1270                 return -ENOMEM;
1271 
1272         trace_seq_init(s);
1273 
1274         print_subsystem_event_filter(system, s);
1275         r = simple_read_from_buffer(ubuf, cnt, ppos,
1276                                     s->buffer, trace_seq_used(s));
1277 
1278         kfree(s);
1279 
1280         return r;
1281 }
1282 
1283 static ssize_t
1284 subsystem_filter_write(struct file *filp, const char __user *ubuf, size_t cnt,
1285                        loff_t *ppos)
1286 {
1287         struct trace_subsystem_dir *dir = filp->private_data;
1288         char *buf;
1289         int err;
1290 
1291         if (cnt >= PAGE_SIZE)
1292                 return -EINVAL;
1293 
1294         buf = (char *)__get_free_page(GFP_TEMPORARY);
1295         if (!buf)
1296                 return -ENOMEM;
1297 
1298         if (copy_from_user(buf, ubuf, cnt)) {
1299                 free_page((unsigned long) buf);
1300                 return -EFAULT;
1301         }
1302         buf[cnt] = '\0';
1303 
1304         err = apply_subsystem_event_filter(dir, buf);
1305         free_page((unsigned long) buf);
1306         if (err < 0)
1307                 return err;
1308 
1309         *ppos += cnt;
1310 
1311         return cnt;
1312 }
1313 
1314 static ssize_t
1315 show_header(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos)
1316 {
1317         int (*func)(struct trace_seq *s) = filp->private_data;
1318         struct trace_seq *s;
1319         int r;
1320 
1321         if (*ppos)
1322                 return 0;
1323 
1324         s = kmalloc(sizeof(*s), GFP_KERNEL);
1325         if (!s)
1326                 return -ENOMEM;
1327 
1328         trace_seq_init(s);
1329 
1330         func(s);
1331         r = simple_read_from_buffer(ubuf, cnt, ppos,
1332                                     s->buffer, trace_seq_used(s));
1333 
1334         kfree(s);
1335 
1336         return r;
1337 }
1338 
1339 static int ftrace_event_avail_open(struct inode *inode, struct file *file);
1340 static int ftrace_event_set_open(struct inode *inode, struct file *file);
1341 static int ftrace_event_release(struct inode *inode, struct file *file);
1342 
1343 static const struct seq_operations show_event_seq_ops = {
1344         .start = t_start,
1345         .next = t_next,
1346         .show = t_show,
1347         .stop = t_stop,
1348 };
1349 
1350 static const struct seq_operations show_set_event_seq_ops = {
1351         .start = s_start,
1352         .next = s_next,
1353         .show = t_show,
1354         .stop = t_stop,
1355 };
1356 
1357 static const struct file_operations ftrace_avail_fops = {
1358         .open = ftrace_event_avail_open,
1359         .read = seq_read,
1360         .llseek = seq_lseek,
1361         .release = seq_release,
1362 };
1363 
1364 static const struct file_operations ftrace_set_event_fops = {
1365         .open = ftrace_event_set_open,
1366         .read = seq_read,
1367         .write = ftrace_event_write,
1368         .llseek = seq_lseek,
1369         .release = ftrace_event_release,
1370 };
1371 
1372 static const struct file_operations ftrace_enable_fops = {
1373         .open = tracing_open_generic,
1374         .read = event_enable_read,
1375         .write = event_enable_write,
1376         .llseek = default_llseek,
1377 };
1378 
1379 static const struct file_operations ftrace_event_format_fops = {
1380         .open = trace_format_open,
1381         .read = seq_read,
1382         .llseek = seq_lseek,
1383         .release = seq_release,
1384 };
1385 
1386 static const struct file_operations ftrace_event_id_fops = {
1387         .read = event_id_read,
1388         .llseek = default_llseek,
1389 };
1390 
1391 static const struct file_operations ftrace_event_filter_fops = {
1392         .open = tracing_open_generic,
1393         .read = event_filter_read,
1394         .write = event_filter_write,
1395         .llseek = default_llseek,
1396 };
1397 
1398 static const struct file_operations ftrace_subsystem_filter_fops = {
1399         .open = subsystem_open,
1400         .read = subsystem_filter_read,
1401         .write = subsystem_filter_write,
1402         .llseek = default_llseek,
1403         .release = subsystem_release,
1404 };
1405 
1406 static const struct file_operations ftrace_system_enable_fops = {
1407         .open = subsystem_open,
1408         .read = system_enable_read,
1409         .write = system_enable_write,
1410         .llseek = default_llseek,
1411         .release = subsystem_release,
1412 };
1413 
1414 static const struct file_operations ftrace_tr_enable_fops = {
1415         .open = system_tr_open,
1416         .read = system_enable_read,
1417         .write = system_enable_write,
1418         .llseek = default_llseek,
1419         .release = subsystem_release,
1420 };
1421 
1422 static const struct file_operations ftrace_show_header_fops = {
1423         .open = tracing_open_generic,
1424         .read = show_header,
1425         .llseek = default_llseek,
1426 };
1427 
1428 static int
1429 ftrace_event_open(struct inode *inode, struct file *file,
1430                   const struct seq_operations *seq_ops)
1431 {
1432         struct seq_file *m;
1433         int ret;
1434 
1435         ret = seq_open(file, seq_ops);
1436         if (ret < 0)
1437                 return ret;
1438         m = file->private_data;
1439         /* copy tr over to seq ops */
1440         m->private = inode->i_private;
1441 
1442         return ret;
1443 }
1444 
1445 static int ftrace_event_release(struct inode *inode, struct file *file)
1446 {
1447         struct trace_array *tr = inode->i_private;
1448 
1449         trace_array_put(tr);
1450 
1451         return seq_release(inode, file);
1452 }
1453 
1454 static int
1455 ftrace_event_avail_open(struct inode *inode, struct file *file)
1456 {
1457         const struct seq_operations *seq_ops = &show_event_seq_ops;
1458 
1459         return ftrace_event_open(inode, file, seq_ops);
1460 }
1461 
1462 static int
1463 ftrace_event_set_open(struct inode *inode, struct file *file)
1464 {
1465         const struct seq_operations *seq_ops = &show_set_event_seq_ops;
1466         struct trace_array *tr = inode->i_private;
1467         int ret;
1468 
1469         if (trace_array_get(tr) < 0)
1470                 return -ENODEV;
1471 
1472         if ((file->f_mode & FMODE_WRITE) &&
1473             (file->f_flags & O_TRUNC))
1474                 ftrace_clear_events(tr);
1475 
1476         ret = ftrace_event_open(inode, file, seq_ops);
1477         if (ret < 0)
1478                 trace_array_put(tr);
1479         return ret;
1480 }
1481 
1482 static struct event_subsystem *
1483 create_new_subsystem(const char *name)
1484 {
1485         struct event_subsystem *system;
1486 
1487         /* need to create new entry */
1488         system = kmalloc(sizeof(*system), GFP_KERNEL);
1489         if (!system)
1490                 return NULL;
1491 
1492         system->ref_count = 1;
1493 
1494         /* Only allocate if dynamic (kprobes and modules) */
1495         if (!core_kernel_data((unsigned long)name)) {
1496                 system->ref_count |= SYSTEM_FL_FREE_NAME;
1497                 system->name = kstrdup(name, GFP_KERNEL);
1498                 if (!system->name)
1499                         goto out_free;
1500         } else
1501                 system->name = name;
1502 
1503         system->filter = NULL;
1504 
1505         system->filter = kzalloc(sizeof(struct event_filter), GFP_KERNEL);
1506         if (!system->filter)
1507                 goto out_free;
1508 
1509         list_add(&system->list, &event_subsystems);
1510 
1511         return system;
1512 
1513  out_free:
1514         if (system->ref_count & SYSTEM_FL_FREE_NAME)
1515                 kfree(system->name);
1516         kfree(system);
1517         return NULL;
1518 }
1519 
1520 static struct dentry *
1521 event_subsystem_dir(struct trace_array *tr, const char *name,
1522                     struct trace_event_file *file, struct dentry *parent)
1523 {
1524         struct trace_subsystem_dir *dir;
1525         struct event_subsystem *system;
1526         struct dentry *entry;
1527 
1528         /* First see if we did not already create this dir */
1529         list_for_each_entry(dir, &tr->systems, list) {
1530                 system = dir->subsystem;
1531                 if (strcmp(system->name, name) == 0) {
1532                         dir->nr_events++;
1533                         file->system = dir;
1534                         return dir->entry;
1535                 }
1536         }
1537 
1538         /* Now see if the system itself exists. */
1539         list_for_each_entry(system, &event_subsystems, list) {
1540                 if (strcmp(system->name, name) == 0)
1541                         break;
1542         }
1543         /* Reset system variable when not found */
1544         if (&system->list == &event_subsystems)
1545                 system = NULL;
1546 
1547         dir = kmalloc(sizeof(*dir), GFP_KERNEL);
1548         if (!dir)
1549                 goto out_fail;
1550 
1551         if (!system) {
1552                 system = create_new_subsystem(name);
1553                 if (!system)
1554                         goto out_free;
1555         } else
1556                 __get_system(system);
1557 
1558         dir->entry = tracefs_create_dir(name, parent);
1559         if (!dir->entry) {
1560                 pr_warn("Failed to create system directory %s\n", name);
1561                 __put_system(system);
1562                 goto out_free;
1563         }
1564 
1565         dir->tr = tr;
1566         dir->ref_count = 1;
1567         dir->nr_events = 1;
1568         dir->subsystem = system;
1569         file->system = dir;
1570 
1571         entry = tracefs_create_file("filter", 0644, dir->entry, dir,
1572                                     &ftrace_subsystem_filter_fops);
1573         if (!entry) {
1574                 kfree(system->filter);
1575                 system->filter = NULL;
1576                 pr_warn("Could not create tracefs '%s/filter' entry\n", name);
1577         }
1578 
1579         trace_create_file("enable", 0644, dir->entry, dir,
1580                           &ftrace_system_enable_fops);
1581 
1582         list_add(&dir->list, &tr->systems);
1583 
1584         return dir->entry;
1585 
1586  out_free:
1587         kfree(dir);
1588  out_fail:
1589         /* Only print this message if failed on memory allocation */
1590         if (!dir || !system)
1591                 pr_warn("No memory to create event subsystem %s\n", name);
1592         return NULL;
1593 }
1594 
1595 static int
1596 event_create_dir(struct dentry *parent, struct trace_event_file *file)
1597 {
1598         struct trace_event_call *call = file->event_call;
1599         struct trace_array *tr = file->tr;
1600         struct list_head *head;
1601         struct dentry *d_events;
1602         const char *name;
1603         int ret;
1604 
1605         /*
1606          * If the trace point header did not define TRACE_SYSTEM
1607          * then the system would be called "TRACE_SYSTEM".
1608          */
1609         if (strcmp(call->class->system, TRACE_SYSTEM) != 0) {
1610                 d_events = event_subsystem_dir(tr, call->class->system, file, parent);
1611                 if (!d_events)
1612                         return -ENOMEM;
1613         } else
1614                 d_events = parent;
1615 
1616         name = trace_event_name(call);
1617         file->dir = tracefs_create_dir(name, d_events);
1618         if (!file->dir) {
1619                 pr_warn("Could not create tracefs '%s' directory\n", name);
1620                 return -1;
1621         }
1622 
1623         if (call->class->reg && !(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE))
1624                 trace_create_file("enable", 0644, file->dir, file,
1625                                   &ftrace_enable_fops);
1626 
1627 #ifdef CONFIG_PERF_EVENTS
1628         if (call->event.type && call->class->reg)
1629                 trace_create_file("id", 0444, file->dir,
1630                                   (void *)(long)call->event.type,
1631                                   &ftrace_event_id_fops);
1632 #endif
1633 
1634         /*
1635          * Other events may have the same class. Only update
1636          * the fields if they are not already defined.
1637          */
1638         head = trace_get_fields(call);
1639         if (list_empty(head)) {
1640                 ret = call->class->define_fields(call);
1641                 if (ret < 0) {
1642                         pr_warn("Could not initialize trace point events/%s\n",
1643                                 name);
1644                         return -1;
1645                 }
1646         }
1647         trace_create_file("filter", 0644, file->dir, file,
1648                           &ftrace_event_filter_fops);
1649 
1650         trace_create_file("trigger", 0644, file->dir, file,
1651                           &event_trigger_fops);
1652 
1653         trace_create_file("format", 0444, file->dir, call,
1654                           &ftrace_event_format_fops);
1655 
1656         return 0;
1657 }
1658 
1659 static void remove_event_from_tracers(struct trace_event_call *call)
1660 {
1661         struct trace_event_file *file;
1662         struct trace_array *tr;
1663 
1664         do_for_each_event_file_safe(tr, file) {
1665                 if (file->event_call != call)
1666                         continue;
1667 
1668                 remove_event_file_dir(file);
1669                 /*
1670                  * The do_for_each_event_file_safe() is
1671                  * a double loop. After finding the call for this
1672                  * trace_array, we use break to jump to the next
1673                  * trace_array.
1674                  */
1675                 break;
1676         } while_for_each_event_file();
1677 }
1678 
1679 static void event_remove(struct trace_event_call *call)
1680 {
1681         struct trace_array *tr;
1682         struct trace_event_file *file;
1683 
1684         do_for_each_event_file(tr, file) {
1685                 if (file->event_call != call)
1686                         continue;
1687                 ftrace_event_enable_disable(file, 0);
1688                 /*
1689                  * The do_for_each_event_file() is
1690                  * a double loop. After finding the call for this
1691                  * trace_array, we use break to jump to the next
1692                  * trace_array.
1693                  */
1694                 break;
1695         } while_for_each_event_file();
1696 
1697         if (call->event.funcs)
1698                 __unregister_trace_event(&call->event);
1699         remove_event_from_tracers(call);
1700         list_del(&call->list);
1701 }
1702 
1703 static int event_init(struct trace_event_call *call)
1704 {
1705         int ret = 0;
1706         const char *name;
1707 
1708         name = trace_event_name(call);
1709         if (WARN_ON(!name))
1710                 return -EINVAL;
1711 
1712         if (call->class->raw_init) {
1713                 ret = call->class->raw_init(call);
1714                 if (ret < 0 && ret != -ENOSYS)
1715                         pr_warn("Could not initialize trace events/%s\n", name);
1716         }
1717 
1718         return ret;
1719 }
1720 
1721 static int
1722 __register_event(struct trace_event_call *call, struct module *mod)
1723 {
1724         int ret;
1725 
1726         ret = event_init(call);
1727         if (ret < 0)
1728                 return ret;
1729 
1730         list_add(&call->list, &ftrace_events);
1731         call->mod = mod;
1732 
1733         return 0;
1734 }
1735 
1736 static char *enum_replace(char *ptr, struct trace_enum_map *map, int len)
1737 {
1738         int rlen;
1739         int elen;
1740 
1741         /* Find the length of the enum value as a string */
1742         elen = snprintf(ptr, 0, "%ld", map->enum_value);
1743         /* Make sure there's enough room to replace the string with the value */
1744         if (len < elen)
1745                 return NULL;
1746 
1747         snprintf(ptr, elen + 1, "%ld", map->enum_value);
1748 
1749         /* Get the rest of the string of ptr */
1750         rlen = strlen(ptr + len);
1751         memmove(ptr + elen, ptr + len, rlen);
1752         /* Make sure we end the new string */
1753         ptr[elen + rlen] = 0;
1754 
1755         return ptr + elen;
1756 }
1757 
1758 static void update_event_printk(struct trace_event_call *call,
1759                                 struct trace_enum_map *map)
1760 {
1761         char *ptr;
1762         int quote = 0;
1763         int len = strlen(map->enum_string);
1764 
1765         for (ptr = call->print_fmt; *ptr; ptr++) {
1766                 if (*ptr == '\\') {
1767                         ptr++;
1768                         /* paranoid */
1769                         if (!*ptr)
1770                                 break;
1771                         continue;
1772                 }
1773                 if (*ptr == '"') {
1774                         quote ^= 1;
1775                         continue;
1776                 }
1777                 if (quote)
1778                         continue;
1779                 if (isdigit(*ptr)) {
1780                         /* skip numbers */
1781                         do {
1782                                 ptr++;
1783                                 /* Check for alpha chars like ULL */
1784                         } while (isalnum(*ptr));
1785                         if (!*ptr)
1786                                 break;
1787                         /*
1788                          * A number must have some kind of delimiter after
1789                          * it, and we can ignore that too.
1790                          */
1791                         continue;
1792                 }
1793                 if (isalpha(*ptr) || *ptr == '_') {
1794                         if (strncmp(map->enum_string, ptr, len) == 0 &&
1795                             !isalnum(ptr[len]) && ptr[len] != '_') {
1796                                 ptr = enum_replace(ptr, map, len);
1797                                 /* Hmm, enum string smaller than value */
1798                                 if (WARN_ON_ONCE(!ptr))
1799                                         return;
1800                                 /*
1801                                  * No need to decrement here, as enum_replace()
1802                                  * returns the pointer to the character passed
1803                                  * the enum, and two enums can not be placed
1804                                  * back to back without something in between.
1805                                  * We can skip that something in between.
1806                                  */
1807                                 continue;
1808                         }
1809                 skip_more:
1810                         do {
1811                                 ptr++;
1812                         } while (isalnum(*ptr) || *ptr == '_');
1813                         if (!*ptr)
1814                                 break;
1815                         /*
1816                          * If what comes after this variable is a '.' or
1817                          * '->' then we can continue to ignore that string.
1818                          */
1819                         if (*ptr == '.' || (ptr[0] == '-' && ptr[1] == '>')) {
1820                                 ptr += *ptr == '.' ? 1 : 2;
1821                                 if (!*ptr)
1822                                         break;
1823                                 goto skip_more;
1824                         }
1825                         /*
1826                          * Once again, we can skip the delimiter that came
1827                          * after the string.
1828                          */
1829                         continue;
1830                 }
1831         }
1832 }
1833 
1834 void trace_event_enum_update(struct trace_enum_map **map, int len)
1835 {
1836         struct trace_event_call *call, *p;
1837         const char *last_system = NULL;
1838         int last_i;
1839         int i;
1840 
1841         down_write(&trace_event_sem);
1842         list_for_each_entry_safe(call, p, &ftrace_events, list) {
1843                 /* events are usually grouped together with systems */
1844                 if (!last_system || call->class->system != last_system) {
1845                         last_i = 0;
1846                         last_system = call->class->system;
1847                 }
1848 
1849                 for (i = last_i; i < len; i++) {
1850                         if (call->class->system == map[i]->system) {
1851                                 /* Save the first system if need be */
1852                                 if (!last_i)
1853                                         last_i = i;
1854                                 update_event_printk(call, map[i]);
1855                         }
1856                 }
1857         }
1858         up_write(&trace_event_sem);
1859 }
1860 
1861 static struct trace_event_file *
1862 trace_create_new_event(struct trace_event_call *call,
1863                        struct trace_array *tr)
1864 {
1865         struct trace_event_file *file;
1866 
1867         file = kmem_cache_alloc(file_cachep, GFP_TRACE);
1868         if (!file)
1869                 return NULL;
1870 
1871         file->event_call = call;
1872         file->tr = tr;
1873         atomic_set(&file->sm_ref, 0);
1874         atomic_set(&file->tm_ref, 0);
1875         INIT_LIST_HEAD(&file->triggers);
1876         list_add(&file->list, &tr->events);
1877 
1878         return file;
1879 }
1880 
1881 /* Add an event to a trace directory */
1882 static int
1883 __trace_add_new_event(struct trace_event_call *call, struct trace_array *tr)
1884 {
1885         struct trace_event_file *file;
1886 
1887         file = trace_create_new_event(call, tr);
1888         if (!file)
1889                 return -ENOMEM;
1890 
1891         return event_create_dir(tr->event_dir, file);
1892 }
1893 
1894 /*
1895  * Just create a decriptor for early init. A descriptor is required
1896  * for enabling events at boot. We want to enable events before
1897  * the filesystem is initialized.
1898  */
1899 static __init int
1900 __trace_early_add_new_event(struct trace_event_call *call,
1901                             struct trace_array *tr)
1902 {
1903         struct trace_event_file *file;
1904 
1905         file = trace_create_new_event(call, tr);
1906         if (!file)
1907                 return -ENOMEM;
1908 
1909         return 0;
1910 }
1911 
1912 struct ftrace_module_file_ops;
1913 static void __add_event_to_tracers(struct trace_event_call *call);
1914 
1915 /* Add an additional event_call dynamically */
1916 int trace_add_event_call(struct trace_event_call *call)
1917 {
1918         int ret;
1919         mutex_lock(&trace_types_lock);
1920         mutex_lock(&event_mutex);
1921 
1922         ret = __register_event(call, NULL);
1923         if (ret >= 0)
1924                 __add_event_to_tracers(call);
1925 
1926         mutex_unlock(&event_mutex);
1927         mutex_unlock(&trace_types_lock);
1928         return ret;
1929 }
1930 
1931 /*
1932  * Must be called under locking of trace_types_lock, event_mutex and
1933  * trace_event_sem.
1934  */
1935 static void __trace_remove_event_call(struct trace_event_call *call)
1936 {
1937         event_remove(call);
1938         trace_destroy_fields(call);
1939         free_event_filter(call->filter);
1940         call->filter = NULL;
1941 }
1942 
1943 static int probe_remove_event_call(struct trace_event_call *call)
1944 {
1945         struct trace_array *tr;
1946         struct trace_event_file *file;
1947 
1948 #ifdef CONFIG_PERF_EVENTS
1949         if (call->perf_refcount)
1950                 return -EBUSY;
1951 #endif
1952         do_for_each_event_file(tr, file) {
1953                 if (file->event_call != call)
1954                         continue;
1955                 /*
1956                  * We can't rely on ftrace_event_enable_disable(enable => 0)
1957                  * we are going to do, EVENT_FILE_FL_SOFT_MODE can suppress
1958                  * TRACE_REG_UNREGISTER.
1959                  */
1960                 if (file->flags & EVENT_FILE_FL_ENABLED)
1961                         return -EBUSY;
1962                 /*
1963                  * The do_for_each_event_file_safe() is
1964                  * a double loop. After finding the call for this
1965                  * trace_array, we use break to jump to the next
1966                  * trace_array.
1967                  */
1968                 break;
1969         } while_for_each_event_file();
1970 
1971         __trace_remove_event_call(call);
1972 
1973         return 0;
1974 }
1975 
1976 /* Remove an event_call */
1977 int trace_remove_event_call(struct trace_event_call *call)
1978 {
1979         int ret;
1980 
1981         mutex_lock(&trace_types_lock);
1982         mutex_lock(&event_mutex);
1983         down_write(&trace_event_sem);
1984         ret = probe_remove_event_call(call);
1985         up_write(&trace_event_sem);
1986         mutex_unlock(&event_mutex);
1987         mutex_unlock(&trace_types_lock);
1988 
1989         return ret;
1990 }
1991 
1992 #define for_each_event(event, start, end)                       \
1993         for (event = start;                                     \
1994              (unsigned long)event < (unsigned long)end;         \
1995              event++)
1996 
1997 #ifdef CONFIG_MODULES
1998 
1999 static void trace_module_add_events(struct module *mod)
2000 {
2001         struct trace_event_call **call, **start, **end;
2002 
2003         if (!mod->num_trace_events)
2004                 return;
2005 
2006         /* Don't add infrastructure for mods without tracepoints */
2007         if (trace_module_has_bad_taint(mod)) {
2008                 pr_err("%s: module has bad taint, not creating trace events\n",
2009                        mod->name);
2010                 return;
2011         }
2012 
2013         start = mod->trace_events;
2014         end = mod->trace_events + mod->num_trace_events;
2015 
2016         for_each_event(call, start, end) {
2017                 __register_event(*call, mod);
2018                 __add_event_to_tracers(*call);
2019         }
2020 }
2021 
2022 static void trace_module_remove_events(struct module *mod)
2023 {
2024         struct trace_event_call *call, *p;
2025         bool clear_trace = false;
2026 
2027         down_write(&trace_event_sem);
2028         list_for_each_entry_safe(call, p, &ftrace_events, list) {
2029                 if (call->mod == mod) {
2030                         if (call->flags & TRACE_EVENT_FL_WAS_ENABLED)
2031                                 clear_trace = true;
2032                         __trace_remove_event_call(call);
2033                 }
2034         }
2035         up_write(&trace_event_sem);
2036 
2037         /*
2038          * It is safest to reset the ring buffer if the module being unloaded
2039          * registered any events that were used. The only worry is if
2040          * a new module gets loaded, and takes on the same id as the events
2041          * of this module. When printing out the buffer, traced events left
2042          * over from this module may be passed to the new module events and
2043          * unexpected results may occur.
2044          */
2045         if (clear_trace)
2046                 tracing_reset_all_online_cpus();
2047 }
2048 
2049 static int trace_module_notify(struct notifier_block *self,
2050                                unsigned long val, void *data)
2051 {
2052         struct module *mod = data;
2053 
2054         mutex_lock(&trace_types_lock);
2055         mutex_lock(&event_mutex);
2056         switch (val) {
2057         case MODULE_STATE_COMING:
2058                 trace_module_add_events(mod);
2059                 break;
2060         case MODULE_STATE_GOING:
2061                 trace_module_remove_events(mod);
2062                 break;
2063         }
2064         mutex_unlock(&event_mutex);
2065         mutex_unlock(&trace_types_lock);
2066 
2067         return 0;
2068 }
2069 
2070 static struct notifier_block trace_module_nb = {
2071         .notifier_call = trace_module_notify,
2072         .priority = 1, /* higher than trace.c module notify */
2073 };
2074 #endif /* CONFIG_MODULES */
2075 
2076 /* Create a new event directory structure for a trace directory. */
2077 static void
2078 __trace_add_event_dirs(struct trace_array *tr)
2079 {
2080         struct trace_event_call *call;
2081         int ret;
2082 
2083         list_for_each_entry(call, &ftrace_events, list) {
2084                 ret = __trace_add_new_event(call, tr);
2085                 if (ret < 0)
2086                         pr_warn("Could not create directory for event %s\n",
2087                                 trace_event_name(call));
2088         }
2089 }
2090 
2091 struct trace_event_file *
2092 find_event_file(struct trace_array *tr, const char *system,  const char *event)
2093 {
2094         struct trace_event_file *file;
2095         struct trace_event_call *call;
2096         const char *name;
2097 
2098         list_for_each_entry(file, &tr->events, list) {
2099 
2100                 call = file->event_call;
2101                 name = trace_event_name(call);
2102 
2103                 if (!name || !call->class || !call->class->reg)
2104                         continue;
2105 
2106                 if (call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)
2107                         continue;
2108 
2109                 if (strcmp(event, name) == 0 &&
2110                     strcmp(system, call->class->system) == 0)
2111                         return file;
2112         }
2113         return NULL;
2114 }
2115 
2116 #ifdef CONFIG_DYNAMIC_FTRACE
2117 
2118 /* Avoid typos */
2119 #define ENABLE_EVENT_STR        "enable_event"
2120 #define DISABLE_EVENT_STR       "disable_event"
2121 
2122 struct event_probe_data {
2123         struct trace_event_file *file;
2124         unsigned long                   count;
2125         int                             ref;
2126         bool                            enable;
2127 };
2128 
2129 static void
2130 event_enable_probe(unsigned long ip, unsigned long parent_ip, void **_data)
2131 {
2132         struct event_probe_data **pdata = (struct event_probe_data **)_data;
2133         struct event_probe_data *data = *pdata;
2134 
2135         if (!data)
2136                 return;
2137 
2138         if (data->enable)
2139                 clear_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &data->file->flags);
2140         else
2141                 set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &data->file->flags);
2142 }
2143 
2144 static void
2145 event_enable_count_probe(unsigned long ip, unsigned long parent_ip, void **_data)
2146 {
2147         struct event_probe_data **pdata = (struct event_probe_data **)_data;
2148         struct event_probe_data *data = *pdata;
2149 
2150         if (!data)
2151                 return;
2152 
2153         if (!data->count)
2154                 return;
2155 
2156         /* Skip if the event is in a state we want to switch to */
2157         if (data->enable == !(data->file->flags & EVENT_FILE_FL_SOFT_DISABLED))
2158                 return;
2159 
2160         if (data->count != -1)
2161                 (data->count)--;
2162 
2163         event_enable_probe(ip, parent_ip, _data);
2164 }
2165 
2166 static int
2167 event_enable_print(struct seq_file *m, unsigned long ip,
2168                       struct ftrace_probe_ops *ops, void *_data)
2169 {
2170         struct event_probe_data *data = _data;
2171 
2172         seq_printf(m, "%ps:", (void *)ip);
2173 
2174         seq_printf(m, "%s:%s:%s",
2175                    data->enable ? ENABLE_EVENT_STR : DISABLE_EVENT_STR,
2176                    data->file->event_call->class->system,
2177                    trace_event_name(data->file->event_call));
2178 
2179         if (data->count == -1)
2180                 seq_puts(m, ":unlimited\n");
2181         else
2182                 seq_printf(m, ":count=%ld\n", data->count);
2183 
2184         return 0;
2185 }
2186 
2187 static int
2188 event_enable_init(struct ftrace_probe_ops *ops, unsigned long ip,
2189                   void **_data)
2190 {
2191         struct event_probe_data **pdata = (struct event_probe_data **)_data;
2192         struct event_probe_data *data = *pdata;
2193 
2194         data->ref++;
2195         return 0;
2196 }
2197 
2198 static void
2199 event_enable_free(struct ftrace_probe_ops *ops, unsigned long ip,
2200                   void **_data)
2201 {
2202         struct event_probe_data **pdata = (struct event_probe_data **)_data;
2203         struct event_probe_data *data = *pdata;
2204 
2205         if (WARN_ON_ONCE(data->ref <= 0))
2206                 return;
2207 
2208         data->ref--;
2209         if (!data->ref) {
2210                 /* Remove the SOFT_MODE flag */
2211                 __ftrace_event_enable_disable(data->file, 0, 1);
2212                 module_put(data->file->event_call->mod);
2213                 kfree(data);
2214         }
2215         *pdata = NULL;
2216 }
2217 
2218 static struct ftrace_probe_ops event_enable_probe_ops = {
2219         .func                   = event_enable_probe,
2220         .print                  = event_enable_print,
2221         .init                   = event_enable_init,
2222         .free                   = event_enable_free,
2223 };
2224 
2225 static struct ftrace_probe_ops event_enable_count_probe_ops = {
2226         .func                   = event_enable_count_probe,
2227         .print                  = event_enable_print,
2228         .init                   = event_enable_init,
2229         .free                   = event_enable_free,
2230 };
2231 
2232 static struct ftrace_probe_ops event_disable_probe_ops = {
2233         .func                   = event_enable_probe,
2234         .print                  = event_enable_print,
2235         .init                   = event_enable_init,
2236         .free                   = event_enable_free,
2237 };
2238 
2239 static struct ftrace_probe_ops event_disable_count_probe_ops = {
2240         .func                   = event_enable_count_probe,
2241         .print                  = event_enable_print,
2242         .init                   = event_enable_init,
2243         .free                   = event_enable_free,
2244 };
2245 
2246 static int
2247 event_enable_func(struct ftrace_hash *hash,
2248                   char *glob, char *cmd, char *param, int enabled)
2249 {
2250         struct trace_array *tr = top_trace_array();
2251         struct trace_event_file *file;
2252         struct ftrace_probe_ops *ops;
2253         struct event_probe_data *data;
2254         const char *system;
2255         const char *event;
2256         char *number;
2257         bool enable;
2258         int ret;
2259 
2260         if (!tr)
2261                 return -ENODEV;
2262 
2263         /* hash funcs only work with set_ftrace_filter */
2264         if (!enabled || !param)
2265                 return -EINVAL;
2266 
2267         system = strsep(&param, ":");
2268         if (!param)
2269                 return -EINVAL;
2270 
2271         event = strsep(&param, ":");
2272 
2273         mutex_lock(&event_mutex);
2274 
2275         ret = -EINVAL;
2276         file = find_event_file(tr, system, event);
2277         if (!file)
2278                 goto out;
2279 
2280         enable = strcmp(cmd, ENABLE_EVENT_STR) == 0;
2281 
2282         if (enable)
2283                 ops = param ? &event_enable_count_probe_ops : &event_enable_probe_ops;
2284         else
2285                 ops = param ? &event_disable_count_probe_ops : &event_disable_probe_ops;
2286 
2287         if (glob[0] == '!') {
2288                 unregister_ftrace_function_probe_func(glob+1, ops);
2289                 ret = 0;
2290                 goto out;
2291         }
2292 
2293         ret = -ENOMEM;
2294         data = kzalloc(sizeof(*data), GFP_KERNEL);
2295         if (!data)
2296                 goto out;
2297 
2298         data->enable = enable;
2299         data->count = -1;
2300         data->file = file;
2301 
2302         if (!param)
2303                 goto out_reg;
2304 
2305         number = strsep(&param, ":");
2306 
2307         ret = -EINVAL;
2308         if (!strlen(number))
2309                 goto out_free;
2310 
2311         /*
2312          * We use the callback data field (which is a pointer)
2313          * as our counter.
2314          */
2315         ret = kstrtoul(number, 0, &data->count);
2316         if (ret)
2317                 goto out_free;
2318 
2319  out_reg:
2320         /* Don't let event modules unload while probe registered */
2321         ret = try_module_get(file->event_call->mod);
2322         if (!ret) {
2323                 ret = -EBUSY;
2324                 goto out_free;
2325         }
2326 
2327         ret = __ftrace_event_enable_disable(file, 1, 1);
2328         if (ret < 0)
2329                 goto out_put;
2330         ret = register_ftrace_function_probe(glob, ops, data);
2331         /*
2332          * The above returns on success the # of functions enabled,
2333          * but if it didn't find any functions it returns zero.
2334          * Consider no functions a failure too.
2335          */
2336         if (!ret) {
2337                 ret = -ENOENT;
2338                 goto out_disable;
2339         } else if (ret < 0)
2340                 goto out_disable;
2341         /* Just return zero, not the number of enabled functions */
2342         ret = 0;
2343  out:
2344         mutex_unlock(&event_mutex);
2345         return ret;
2346 
2347  out_disable:
2348         __ftrace_event_enable_disable(file, 0, 1);
2349  out_put:
2350         module_put(file->event_call->mod);
2351  out_free:
2352         kfree(data);
2353         goto out;
2354 }
2355 
2356 static struct ftrace_func_command event_enable_cmd = {
2357         .name                   = ENABLE_EVENT_STR,
2358         .func                   = event_enable_func,
2359 };
2360 
2361 static struct ftrace_func_command event_disable_cmd = {
2362         .name                   = DISABLE_EVENT_STR,
2363         .func                   = event_enable_func,
2364 };
2365 
2366 static __init int register_event_cmds(void)
2367 {
2368         int ret;
2369 
2370         ret = register_ftrace_command(&event_enable_cmd);
2371         if (WARN_ON(ret < 0))
2372                 return ret;
2373         ret = register_ftrace_command(&event_disable_cmd);
2374         if (WARN_ON(ret < 0))
2375                 unregister_ftrace_command(&event_enable_cmd);
2376         return ret;
2377 }
2378 #else
2379 static inline int register_event_cmds(void) { return 0; }
2380 #endif /* CONFIG_DYNAMIC_FTRACE */
2381 
2382 /*
2383  * The top level array has already had its trace_event_file
2384  * descriptors created in order to allow for early events to
2385  * be recorded. This function is called after the tracefs has been
2386  * initialized, and we now have to create the files associated
2387  * to the events.
2388  */
2389 static __init void
2390 __trace_early_add_event_dirs(struct trace_array *tr)
2391 {
2392         struct trace_event_file *file;
2393         int ret;
2394 
2395 
2396         list_for_each_entry(file, &tr->events, list) {
2397                 ret = event_create_dir(tr->event_dir, file);
2398                 if (ret < 0)
2399                         pr_warn("Could not create directory for event %s\n",
2400                                 trace_event_name(file->event_call));
2401         }
2402 }
2403 
2404 /*
2405  * For early boot up, the top trace array requires to have
2406  * a list of events that can be enabled. This must be done before
2407  * the filesystem is set up in order to allow events to be traced
2408  * early.
2409  */
2410 static __init void
2411 __trace_early_add_events(struct trace_array *tr)
2412 {
2413         struct trace_event_call *call;
2414         int ret;
2415 
2416         list_for_each_entry(call, &ftrace_events, list) {
2417                 /* Early boot up should not have any modules loaded */
2418                 if (WARN_ON_ONCE(call->mod))
2419                         continue;
2420 
2421                 ret = __trace_early_add_new_event(call, tr);
2422                 if (ret < 0)
2423                         pr_warn("Could not create early event %s\n",
2424                                 trace_event_name(call));
2425         }
2426 }
2427 
2428 /* Remove the event directory structure for a trace directory. */
2429 static void
2430 __trace_remove_event_dirs(struct trace_array *tr)
2431 {
2432         struct trace_event_file *file, *next;
2433 
2434         list_for_each_entry_safe(file, next, &tr->events, list)
2435                 remove_event_file_dir(file);
2436 }
2437 
2438 static void __add_event_to_tracers(struct trace_event_call *call)
2439 {
2440         struct trace_array *tr;
2441 
2442         list_for_each_entry(tr, &ftrace_trace_arrays, list)
2443                 __trace_add_new_event(call, tr);
2444 }
2445 
2446 extern struct trace_event_call *__start_ftrace_events[];
2447 extern struct trace_event_call *__stop_ftrace_events[];
2448 
2449 static char bootup_event_buf[COMMAND_LINE_SIZE] __initdata;
2450 
2451 static __init int setup_trace_event(char *str)
2452 {
2453         strlcpy(bootup_event_buf, str, COMMAND_LINE_SIZE);
2454         ring_buffer_expanded = true;
2455         tracing_selftest_disabled = true;
2456 
2457         return 1;
2458 }
2459 __setup("trace_event=", setup_trace_event);
2460 
2461 /* Expects to have event_mutex held when called */
2462 static int
2463 create_event_toplevel_files(struct dentry *parent, struct trace_array *tr)
2464 {
2465         struct dentry *d_events;
2466         struct dentry *entry;
2467 
2468         entry = tracefs_create_file("set_event", 0644, parent,
2469                                     tr, &ftrace_set_event_fops);
2470         if (!entry) {
2471                 pr_warn("Could not create tracefs 'set_event' entry\n");
2472                 return -ENOMEM;
2473         }
2474 
2475         d_events = tracefs_create_dir("events", parent);
2476         if (!d_events) {
2477                 pr_warn("Could not create tracefs 'events' directory\n");
2478                 return -ENOMEM;
2479         }
2480 
2481         /* ring buffer internal formats */
2482         trace_create_file("header_page", 0444, d_events,
2483                           ring_buffer_print_page_header,
2484                           &ftrace_show_header_fops);
2485 
2486         trace_create_file("header_event", 0444, d_events,
2487                           ring_buffer_print_entry_header,
2488                           &ftrace_show_header_fops);
2489 
2490         trace_create_file("enable", 0644, d_events,
2491                           tr, &ftrace_tr_enable_fops);
2492 
2493         tr->event_dir = d_events;
2494 
2495         return 0;
2496 }
2497 
2498 /**
2499  * event_trace_add_tracer - add a instance of a trace_array to events
2500  * @parent: The parent dentry to place the files/directories for events in
2501  * @tr: The trace array associated with these events
2502  *
2503  * When a new instance is created, it needs to set up its events
2504  * directory, as well as other files associated with events. It also
2505  * creates the event hierachry in the @parent/events directory.
2506  *
2507  * Returns 0 on success.
2508  */
2509 int event_trace_add_tracer(struct dentry *parent, struct trace_array *tr)
2510 {
2511         int ret;
2512 
2513         mutex_lock(&event_mutex);
2514 
2515         ret = create_event_toplevel_files(parent, tr);
2516         if (ret)
2517                 goto out_unlock;
2518 
2519         down_write(&trace_event_sem);
2520         __trace_add_event_dirs(tr);
2521         up_write(&trace_event_sem);
2522 
2523  out_unlock:
2524         mutex_unlock(&event_mutex);
2525 
2526         return ret;
2527 }
2528 
2529 /*
2530  * The top trace array already had its file descriptors created.
2531  * Now the files themselves need to be created.
2532  */
2533 static __init int
2534 early_event_add_tracer(struct dentry *parent, struct trace_array *tr)
2535 {
2536         int ret;
2537 
2538         mutex_lock(&event_mutex);
2539 
2540         ret = create_event_toplevel_files(parent, tr);
2541         if (ret)
2542                 goto out_unlock;
2543 
2544         down_write(&trace_event_sem);
2545         __trace_early_add_event_dirs(tr);
2546         up_write(&trace_event_sem);
2547 
2548  out_unlock:
2549         mutex_unlock(&event_mutex);
2550 
2551         return ret;
2552 }
2553 
2554 int event_trace_del_tracer(struct trace_array *tr)
2555 {
2556         mutex_lock(&event_mutex);
2557 
2558         /* Disable any event triggers and associated soft-disabled events */
2559         clear_event_triggers(tr);
2560 
2561         /* Disable any running events */
2562         __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0);
2563 
2564         /* Access to events are within rcu_read_lock_sched() */
2565         synchronize_sched();
2566 
2567         down_write(&trace_event_sem);
2568         __trace_remove_event_dirs(tr);
2569         tracefs_remove_recursive(tr->event_dir);
2570         up_write(&trace_event_sem);
2571 
2572         tr->event_dir = NULL;
2573 
2574         mutex_unlock(&event_mutex);
2575 
2576         return 0;
2577 }
2578 
2579 static __init int event_trace_memsetup(void)
2580 {
2581         field_cachep = KMEM_CACHE(ftrace_event_field, SLAB_PANIC);
2582         file_cachep = KMEM_CACHE(trace_event_file, SLAB_PANIC);
2583         return 0;
2584 }
2585 
2586 static __init void
2587 early_enable_events(struct trace_array *tr, bool disable_first)
2588 {
2589         char *buf = bootup_event_buf;
2590         char *token;
2591         int ret;
2592 
2593         while (true) {
2594                 token = strsep(&buf, ",");
2595 
2596                 if (!token)
2597                         break;
2598                 if (!*token)
2599                         continue;
2600 
2601                 /* Restarting syscalls requires that we stop them first */
2602                 if (disable_first)
2603                         ftrace_set_clr_event(tr, token, 0);
2604 
2605                 ret = ftrace_set_clr_event(tr, token, 1);
2606                 if (ret)
2607                         pr_warn("Failed to enable trace event: %s\n", token);
2608 
2609                 /* Put back the comma to allow this to be called again */
2610                 if (buf)
2611                         *(buf - 1) = ',';
2612         }
2613 }
2614 
2615 static __init int event_trace_enable(void)
2616 {
2617         struct trace_array *tr = top_trace_array();
2618         struct trace_event_call **iter, *call;
2619         int ret;
2620 
2621         if (!tr)
2622                 return -ENODEV;
2623 
2624         for_each_event(iter, __start_ftrace_events, __stop_ftrace_events) {
2625 
2626                 call = *iter;
2627                 ret = event_init(call);
2628                 if (!ret)
2629                         list_add(&call->list, &ftrace_events);
2630         }
2631 
2632         /*
2633          * We need the top trace array to have a working set of trace
2634          * points at early init, before the debug files and directories
2635          * are created. Create the file entries now, and attach them
2636          * to the actual file dentries later.
2637          */
2638         __trace_early_add_events(tr);
2639 
2640         early_enable_events(tr, false);
2641 
2642         trace_printk_start_comm();
2643 
2644         register_event_cmds();
2645 
2646         register_trigger_cmds();
2647 
2648         return 0;
2649 }
2650 
2651 /*
2652  * event_trace_enable() is called from trace_event_init() first to
2653  * initialize events and perhaps start any events that are on the
2654  * command line. Unfortunately, there are some events that will not
2655  * start this early, like the system call tracepoints that need
2656  * to set the TIF_SYSCALL_TRACEPOINT flag of pid 1. But event_trace_enable()
2657  * is called before pid 1 starts, and this flag is never set, making
2658  * the syscall tracepoint never get reached, but the event is enabled
2659  * regardless (and not doing anything).
2660  */
2661 static __init int event_trace_enable_again(void)
2662 {
2663         struct trace_array *tr;
2664 
2665         tr = top_trace_array();
2666         if (!tr)
2667                 return -ENODEV;
2668 
2669         early_enable_events(tr, true);
2670 
2671         return 0;
2672 }
2673 
2674 early_initcall(event_trace_enable_again);
2675 
2676 static __init int event_trace_init(void)
2677 {
2678         struct trace_array *tr;
2679         struct dentry *d_tracer;
2680         struct dentry *entry;
2681         int ret;
2682 
2683         tr = top_trace_array();
2684         if (!tr)
2685                 return -ENODEV;
2686 
2687         d_tracer = tracing_init_dentry();
2688         if (IS_ERR(d_tracer))
2689                 return 0;
2690 
2691         entry = tracefs_create_file("available_events", 0444, d_tracer,
2692                                     tr, &ftrace_avail_fops);
2693         if (!entry)
2694                 pr_warn("Could not create tracefs 'available_events' entry\n");
2695 
2696         if (trace_define_generic_fields())
2697                 pr_warn("tracing: Failed to allocated generic fields");
2698 
2699         if (trace_define_common_fields())
2700                 pr_warn("tracing: Failed to allocate common fields");
2701 
2702         ret = early_event_add_tracer(d_tracer, tr);
2703         if (ret)
2704                 return ret;
2705 
2706 #ifdef CONFIG_MODULES
2707         ret = register_module_notifier(&trace_module_nb);
2708         if (ret)
2709                 pr_warn("Failed to register trace events module notifier\n");
2710 #endif
2711         return 0;
2712 }
2713 
2714 void __init trace_event_init(void)
2715 {
2716         event_trace_memsetup();
2717         init_ftrace_syscalls();
2718         event_trace_enable();
2719 }
2720 
2721 fs_initcall(event_trace_init);
2722 
2723 #ifdef CONFIG_FTRACE_STARTUP_TEST
2724 
2725 static DEFINE_SPINLOCK(test_spinlock);
2726 static DEFINE_SPINLOCK(test_spinlock_irq);
2727 static DEFINE_MUTEX(test_mutex);
2728 
2729 static __init void test_work(struct work_struct *dummy)
2730 {
2731         spin_lock(&test_spinlock);
2732         spin_lock_irq(&test_spinlock_irq);
2733         udelay(1);
2734         spin_unlock_irq(&test_spinlock_irq);
2735         spin_unlock(&test_spinlock);
2736 
2737         mutex_lock(&test_mutex);
2738         msleep(1);
2739         mutex_unlock(&test_mutex);
2740 }
2741 
2742 static __init int event_test_thread(void *unused)
2743 {
2744         void *test_malloc;
2745 
2746         test_malloc = kmalloc(1234, GFP_KERNEL);
2747         if (!test_malloc)
2748                 pr_info("failed to kmalloc\n");
2749 
2750         schedule_on_each_cpu(test_work);
2751 
2752         kfree(test_malloc);
2753 
2754         set_current_state(TASK_INTERRUPTIBLE);
2755         while (!kthread_should_stop()) {
2756                 schedule();
2757                 set_current_state(TASK_INTERRUPTIBLE);
2758         }
2759         __set_current_state(TASK_RUNNING);
2760 
2761         return 0;
2762 }
2763 
2764 /*
2765  * Do various things that may trigger events.
2766  */
2767 static __init void event_test_stuff(void)
2768 {
2769         struct task_struct *test_thread;
2770 
2771         test_thread = kthread_run(event_test_thread, NULL, "test-events");
2772         msleep(1);
2773         kthread_stop(test_thread);
2774 }
2775 
2776 /*
2777  * For every trace event defined, we will test each trace point separately,
2778  * and then by groups, and finally all trace points.
2779  */
2780 static __init void event_trace_self_tests(void)
2781 {
2782         struct trace_subsystem_dir *dir;
2783         struct trace_event_file *file;
2784         struct trace_event_call *call;
2785         struct event_subsystem *system;
2786         struct trace_array *tr;
2787         int ret;
2788 
2789         tr = top_trace_array();
2790         if (!tr)
2791                 return;
2792 
2793         pr_info("Running tests on trace events:\n");
2794 
2795         list_for_each_entry(file, &tr->events, list) {
2796 
2797                 call = file->event_call;
2798 
2799                 /* Only test those that have a probe */
2800                 if (!call->class || !call->class->probe)
2801                         continue;
2802 
2803 /*
2804  * Testing syscall events here is pretty useless, but
2805  * we still do it if configured. But this is time consuming.
2806  * What we really need is a user thread to perform the
2807  * syscalls as we test.
2808  */
2809 #ifndef CONFIG_EVENT_TRACE_TEST_SYSCALLS
2810                 if (call->class->system &&
2811                     strcmp(call->class->system, "syscalls") == 0)
2812                         continue;
2813 #endif
2814 
2815                 pr_info("Testing event %s: ", trace_event_name(call));
2816 
2817                 /*
2818                  * If an event is already enabled, someone is using
2819                  * it and the self test should not be on.
2820                  */
2821                 if (file->flags & EVENT_FILE_FL_ENABLED) {
2822                         pr_warn("Enabled event during self test!\n");
2823                         WARN_ON_ONCE(1);
2824                         continue;
2825                 }
2826 
2827                 ftrace_event_enable_disable(file, 1);
2828                 event_test_stuff();
2829                 ftrace_event_enable_disable(file, 0);
2830 
2831                 pr_cont("OK\n");
2832         }
2833 
2834         /* Now test at the sub system level */
2835 
2836         pr_info("Running tests on trace event systems:\n");
2837 
2838         list_for_each_entry(dir, &tr->systems, list) {
2839 
2840                 system = dir->subsystem;
2841 
2842                 /* the ftrace system is special, skip it */
2843                 if (strcmp(system->name, "ftrace") == 0)
2844                         continue;
2845 
2846                 pr_info("Testing event system %s: ", system->name);
2847 
2848                 ret = __ftrace_set_clr_event(tr, NULL, system->name, NULL, 1);
2849                 if (WARN_ON_ONCE(ret)) {
2850                         pr_warn("error enabling system %s\n",
2851                                 system->name);
2852                         continue;
2853                 }
2854 
2855                 event_test_stuff();
2856 
2857                 ret = __ftrace_set_clr_event(tr, NULL, system->name, NULL, 0);
2858                 if (WARN_ON_ONCE(ret)) {
2859                         pr_warn("error disabling system %s\n",
2860                                 system->name);
2861                         continue;
2862                 }
2863 
2864                 pr_cont("OK\n");
2865         }
2866 
2867         /* Test with all events enabled */
2868 
2869         pr_info("Running tests on all trace events:\n");
2870         pr_info("Testing all events: ");
2871 
2872         ret = __ftrace_set_clr_event(tr, NULL, NULL, NULL, 1);
2873         if (WARN_ON_ONCE(ret)) {
2874                 pr_warn("error enabling all events\n");
2875                 return;
2876         }
2877 
2878         event_test_stuff();
2879 
2880         /* reset sysname */
2881         ret = __ftrace_set_clr_event(tr, NULL, NULL, NULL, 0);
2882         if (WARN_ON_ONCE(ret)) {
2883                 pr_warn("error disabling all events\n");
2884                 return;
2885         }
2886 
2887         pr_cont("OK\n");
2888 }
2889 
2890 #ifdef CONFIG_FUNCTION_TRACER
2891 
2892 static DEFINE_PER_CPU(atomic_t, ftrace_test_event_disable);
2893 
2894 static void
2895 function_test_events_call(unsigned long ip, unsigned long parent_ip,
2896                           struct ftrace_ops *op, struct pt_regs *pt_regs)
2897 {
2898         struct ring_buffer_event *event;
2899         struct ring_buffer *buffer;
2900         struct ftrace_entry *entry;
2901         unsigned long flags;
2902         long disabled;
2903         int cpu;
2904         int pc;
2905 
2906         pc = preempt_count();
2907         preempt_disable_notrace();
2908         cpu = raw_smp_processor_id();
2909         disabled = atomic_inc_return(&per_cpu(ftrace_test_event_disable, cpu));
2910 
2911         if (disabled != 1)
2912                 goto out;
2913 
2914         local_save_flags(flags);
2915 
2916         event = trace_current_buffer_lock_reserve(&buffer,
2917                                                   TRACE_FN, sizeof(*entry),
2918                                                   flags, pc);
2919         if (!event)
2920                 goto out;
2921         entry   = ring_buffer_event_data(event);
2922         entry->ip                       = ip;
2923         entry->parent_ip                = parent_ip;
2924 
2925         trace_buffer_unlock_commit(buffer, event, flags, pc);
2926 
2927  out:
2928         atomic_dec(&per_cpu(ftrace_test_event_disable, cpu));
2929         preempt_enable_notrace();
2930 }
2931 
2932 static struct ftrace_ops trace_ops __initdata  =
2933 {
2934         .func = function_test_events_call,
2935         .flags = FTRACE_OPS_FL_RECURSION_SAFE,
2936 };
2937 
2938 static __init void event_trace_self_test_with_function(void)
2939 {
2940         int ret;
2941         ret = register_ftrace_function(&trace_ops);
2942         if (WARN_ON(ret < 0)) {
2943                 pr_info("Failed to enable function tracer for event tests\n");
2944                 return;
2945         }
2946         pr_info("Running tests again, along with the function tracer\n");
2947         event_trace_self_tests();
2948         unregister_ftrace_function(&trace_ops);
2949 }
2950 #else
2951 static __init void event_trace_self_test_with_function(void)
2952 {
2953 }
2954 #endif
2955 
2956 static __init int event_trace_self_tests_init(void)
2957 {
2958         if (!tracing_selftest_disabled) {
2959                 event_trace_self_tests();
2960                 event_trace_self_test_with_function();
2961         }
2962 
2963         return 0;
2964 }
2965 
2966 late_initcall(event_trace_self_tests_init);
2967 
2968 #endif
2969 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp