Lines Matching +full:m +full:- +full:class
1 // SPDX-License-Identifier: GPL-2.0
7 * - Added format output of fields of the trace point.
58 return system->ref_count; in system_refcount()
63 return system->ref_count++; in system_refcount_inc()
68 return --system->ref_count; in system_refcount_dec()
74 list_for_each_entry(file, &tr->events, list)
79 list_for_each_entry_safe(file, ___n, &tr->events, list)
90 if (!strcmp(field->name, name)) in __find_event_field()
124 return -ENOMEM; in __trace_define_field()
126 field->name = name; in __trace_define_field()
127 field->type = type; in __trace_define_field()
130 field->filter_type = filter_assign_type(type); in __trace_define_field()
132 field->filter_type = filter_type; in __trace_define_field()
134 field->offset = offset; in __trace_define_field()
135 field->size = size; in __trace_define_field()
136 field->is_signed = is_signed; in __trace_define_field()
137 field->needs_test = need_test; in __trace_define_field()
138 field->len = len; in __trace_define_field()
140 list_add(&field->link, head); in __trace_define_field()
151 if (WARN_ON(!call->class)) in trace_define_field()
166 if (WARN_ON(!call->class)) in trace_define_field_ext()
227 list_del(&field->link); in trace_destroy_fields()
233 * run-time version of trace_event_get_offsets_<call>() that returns the last
243 * head->next points to the last field with the largest offset, in trace_event_get_offsets()
247 return tail->offset + tail->size; in trace_event_get_offsets()
254 struct trace_event_fields *field = call->class->fields_array; in find_event_field()
258 if (!(len = str_has_prefix(fmt, "REC->"))) in find_event_field()
265 len = p - fmt; in find_event_field()
267 for (; field->type; field++) { in find_event_field()
268 if (strncmp(field->name, fmt, len) || field->name[len]) in find_event_field()
289 return strchr(field->type, '[') != NULL; in test_field()
308 /* Find the REC-> in the argument */ in process_pointer()
309 r = strstr(fmt, "REC->"); in process_pointer()
354 for (int i = 1; r - i >= s; i++) { in process_string()
355 char ch = *(r - i); in process_string()
368 * Check for arrays. If the argument has: foo[REC->val] in process_string()
374 r = strstr(r, "REC->"); in process_string()
381 * could be: REC->field ? "foo" : "bar" and we don't want to get into in process_string()
397 call->flags |= TRACE_EVENT_FL_TEST_STR; in process_string()
398 field->needs_test = 1; in process_string()
435 fmt = call->print_fmt; in test_event_printk()
491 case 'b': case 'M': case 'm': in test_event_printk()
550 parens--; in test_event_printk()
555 (i - start_arg) + 5, "^")) in test_event_printk()
575 i--; in test_event_printk()
581 e - start_arg, in test_event_printk()
588 i--; in test_event_printk()
594 i - start_arg, in test_event_printk()
622 id = register_trace_event(&call->event); in trace_event_raw_init()
624 return -ENODEV; in trace_event_raw_init()
634 struct trace_array *tr = trace_file->tr; in trace_event_ignore_this_pid()
638 pid_list = rcu_dereference_raw(tr->filtered_pids); in trace_event_ignore_this_pid()
639 no_pid_list = rcu_dereference_raw(tr->filtered_no_pids); in trace_event_ignore_this_pid()
648 return this_cpu_read(tr->array_buffer.data->ignore_pid) != 0; in trace_event_ignore_this_pid()
656 struct trace_event_call *event_call = trace_file->event_call; in trace_event_buffer_reserve()
658 if ((trace_file->flags & EVENT_FILE_FL_PID_FILTER) && in trace_event_buffer_reserve()
668 fbuffer->trace_ctx = tracing_gen_ctx_dec(); in trace_event_buffer_reserve()
669 fbuffer->trace_file = trace_file; in trace_event_buffer_reserve()
671 fbuffer->event = in trace_event_buffer_reserve()
672 trace_event_buffer_lock_reserve(&fbuffer->buffer, trace_file, in trace_event_buffer_reserve()
673 event_call->event.type, len, in trace_event_buffer_reserve()
674 fbuffer->trace_ctx); in trace_event_buffer_reserve()
675 if (!fbuffer->event) in trace_event_buffer_reserve()
678 fbuffer->regs = NULL; in trace_event_buffer_reserve()
679 fbuffer->entry = ring_buffer_event_data(fbuffer->event); in trace_event_buffer_reserve()
680 return fbuffer->entry; in trace_event_buffer_reserve()
689 WARN_ON(!(call->flags & TRACE_EVENT_FL_TRACEPOINT)); in trace_event_reg()
692 return tracepoint_probe_register(call->tp, in trace_event_reg()
693 call->class->probe, in trace_event_reg()
696 tracepoint_probe_unregister(call->tp, in trace_event_reg()
697 call->class->probe, in trace_event_reg()
703 return tracepoint_probe_register(call->tp, in trace_event_reg()
704 call->class->perf_probe, in trace_event_reg()
707 tracepoint_probe_unregister(call->tp, in trace_event_reg()
708 call->class->perf_probe, in trace_event_reg()
731 if (!(file->flags & EVENT_FILE_FL_ENABLED)) in trace_event_enable_cmd_record()
736 set_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags); in trace_event_enable_cmd_record()
739 clear_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags); in trace_event_enable_cmd_record()
752 if (!(file->flags & EVENT_FILE_FL_ENABLED)) in trace_event_enable_tgid_record()
757 set_bit(EVENT_FILE_FL_RECORDED_TGID_BIT, &file->flags); in trace_event_enable_tgid_record()
761 &file->flags); in trace_event_enable_tgid_record()
769 struct trace_event_call *call = file->event_call; in __ftrace_event_enable_disable()
770 struct trace_array *tr = file->tr; in __ftrace_event_enable_disable()
771 bool soft_mode = atomic_read(&file->sm_ref) != 0; in __ftrace_event_enable_disable()
791 if (atomic_dec_return(&file->sm_ref) > 0) in __ftrace_event_enable_disable()
793 disable = file->flags & EVENT_FILE_FL_SOFT_DISABLED; in __ftrace_event_enable_disable()
800 if (disable && (file->flags & EVENT_FILE_FL_ENABLED)) { in __ftrace_event_enable_disable()
801 clear_bit(EVENT_FILE_FL_ENABLED_BIT, &file->flags); in __ftrace_event_enable_disable()
802 if (file->flags & EVENT_FILE_FL_RECORDED_CMD) { in __ftrace_event_enable_disable()
804 clear_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags); in __ftrace_event_enable_disable()
807 if (file->flags & EVENT_FILE_FL_RECORDED_TGID) { in __ftrace_event_enable_disable()
809 clear_bit(EVENT_FILE_FL_RECORDED_TGID_BIT, &file->flags); in __ftrace_event_enable_disable()
812 ret = call->class->reg(call, TRACE_REG_UNREGISTER, file); in __ftrace_event_enable_disable()
818 set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags); in __ftrace_event_enable_disable()
820 clear_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags); in __ftrace_event_enable_disable()
832 clear_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags); in __ftrace_event_enable_disable()
834 if (atomic_inc_return(&file->sm_ref) > 1) in __ftrace_event_enable_disable()
841 if (!(file->flags & EVENT_FILE_FL_ENABLED)) { in __ftrace_event_enable_disable()
846 set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags); in __ftrace_event_enable_disable()
848 if (tr->trace_flags & TRACE_ITER_RECORD_CMD) { in __ftrace_event_enable_disable()
851 set_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags); in __ftrace_event_enable_disable()
854 if (tr->trace_flags & TRACE_ITER_RECORD_TGID) { in __ftrace_event_enable_disable()
857 set_bit(EVENT_FILE_FL_RECORDED_TGID_BIT, &file->flags); in __ftrace_event_enable_disable()
860 ret = call->class->reg(call, TRACE_REG_REGISTER, file); in __ftrace_event_enable_disable()
870 set_bit(EVENT_FILE_FL_ENABLED_BIT, &file->flags); in __ftrace_event_enable_disable()
873 set_bit(EVENT_FILE_FL_WAS_ENABLED_BIT, &file->flags); in __ftrace_event_enable_disable()
904 list_del(&event_mod->list); in free_event_mod()
905 kfree(event_mod->module); in free_event_mod()
906 kfree(event_mod->match); in free_event_mod()
907 kfree(event_mod->system); in free_event_mod()
908 kfree(event_mod->event); in free_event_mod()
916 list_for_each_entry_safe(event_mod, n, &tr->mod_events, list) { in clear_mod_events()
925 int ret = -EINVAL; in remove_cache_mod()
927 list_for_each_entry_safe(event_mod, n, &tr->mod_events, list) { in remove_cache_mod()
928 if (strcmp(event_mod->module, mod) != 0) in remove_cache_mod()
931 if (match && strcmp(event_mod->match, match) != 0) in remove_cache_mod()
935 (!event_mod->system || strcmp(event_mod->system, system) != 0)) in remove_cache_mod()
939 (!event_mod->event || strcmp(event_mod->event, event) != 0)) in remove_cache_mod()
956 return -EINVAL; in cache_mod()
964 return -ENOMEM; in cache_mod()
966 INIT_LIST_HEAD(&event_mod->list); in cache_mod()
967 event_mod->module = kstrdup(mod, GFP_KERNEL); in cache_mod()
968 if (!event_mod->module) in cache_mod()
972 event_mod->match = kstrdup(match, GFP_KERNEL); in cache_mod()
973 if (!event_mod->match) in cache_mod()
978 event_mod->system = kstrdup(system, GFP_KERNEL); in cache_mod()
979 if (!event_mod->system) in cache_mod()
984 event_mod->event = kstrdup(event, GFP_KERNEL); in cache_mod()
985 if (!event_mod->event) in cache_mod()
989 list_add(&event_mod->list, &tr->mod_events); in cache_mod()
996 return -ENOMEM; in cache_mod()
1003 return -EINVAL; in cache_mod()
1012 list_for_each_entry(file, &tr->events, list) { in ftrace_clear_events()
1025 pid_list = rcu_dereference_raw(tr->filtered_pids); in event_filter_pid_sched_process_exit()
1028 pid_list = rcu_dereference_raw(tr->filtered_no_pids); in event_filter_pid_sched_process_exit()
1040 pid_list = rcu_dereference_sched(tr->filtered_pids); in event_filter_pid_sched_process_fork()
1043 pid_list = rcu_dereference_sched(tr->filtered_no_pids); in event_filter_pid_sched_process_fork()
1073 pid_list = rcu_dereference_sched(tr->filtered_pids); in event_filter_pid_sched_switch_probe_pre()
1074 no_pid_list = rcu_dereference_sched(tr->filtered_no_pids); in event_filter_pid_sched_switch_probe_pre()
1083 this_cpu_write(tr->array_buffer.data->ignore_pid, ret || in event_filter_pid_sched_switch_probe_pre()
1098 pid_list = rcu_dereference_sched(tr->filtered_pids); in event_filter_pid_sched_switch_probe_post()
1099 no_pid_list = rcu_dereference_sched(tr->filtered_no_pids); in event_filter_pid_sched_switch_probe_post()
1101 this_cpu_write(tr->array_buffer.data->ignore_pid, in event_filter_pid_sched_switch_probe_post()
1113 if (!this_cpu_read(tr->array_buffer.data->ignore_pid)) in event_filter_pid_sched_wakeup_probe_pre()
1116 pid_list = rcu_dereference_sched(tr->filtered_pids); in event_filter_pid_sched_wakeup_probe_pre()
1117 no_pid_list = rcu_dereference_sched(tr->filtered_no_pids); in event_filter_pid_sched_wakeup_probe_pre()
1119 this_cpu_write(tr->array_buffer.data->ignore_pid, in event_filter_pid_sched_wakeup_probe_pre()
1131 if (this_cpu_read(tr->array_buffer.data->ignore_pid)) in event_filter_pid_sched_wakeup_probe_post()
1134 pid_list = rcu_dereference_sched(tr->filtered_pids); in event_filter_pid_sched_wakeup_probe_post()
1135 no_pid_list = rcu_dereference_sched(tr->filtered_no_pids); in event_filter_pid_sched_wakeup_probe_post()
1138 this_cpu_write(tr->array_buffer.data->ignore_pid, in event_filter_pid_sched_wakeup_probe_post()
1164 pid_list = rcu_dereference_protected(tr->filtered_pids, in __ftrace_clear_event_pids()
1166 no_pid_list = rcu_dereference_protected(tr->filtered_no_pids, in __ftrace_clear_event_pids()
1176 list_for_each_entry(file, &tr->events, list) { in __ftrace_clear_event_pids()
1177 clear_bit(EVENT_FILE_FL_PID_FILTER_BIT, &file->flags); in __ftrace_clear_event_pids()
1181 per_cpu_ptr(tr->array_buffer.data, cpu)->ignore_pid = false; in __ftrace_clear_event_pids()
1185 rcu_assign_pointer(tr->filtered_pids, NULL); in __ftrace_clear_event_pids()
1188 rcu_assign_pointer(tr->filtered_no_pids, NULL); in __ftrace_clear_event_pids()
1209 struct event_filter *filter = system->filter; in __put_system()
1215 list_del(&system->list); in __put_system()
1218 kfree(filter->filter_string); in __put_system()
1221 kfree_const(system->name); in __put_system()
1233 WARN_ON_ONCE(dir->ref_count == 0); in __get_system_dir()
1234 dir->ref_count++; in __get_system_dir()
1235 __get_system(dir->subsystem); in __get_system_dir()
1240 WARN_ON_ONCE(dir->ref_count == 0); in __put_system_dir()
1242 WARN_ON_ONCE(system_refcount(dir->subsystem) == 1 && dir->ref_count != 1); in __put_system_dir()
1244 __put_system(dir->subsystem); in __put_system_dir()
1245 if (!--dir->ref_count) in __put_system_dir()
1261 if (!--dir->nr_events) { in remove_subsystem()
1262 eventfs_remove_dir(dir->ei); in remove_subsystem()
1263 list_del(&dir->list); in remove_subsystem()
1270 refcount_inc(&file->ref); in event_file_get()
1275 if (WARN_ON_ONCE(!refcount_read(&file->ref))) { in event_file_put()
1276 if (file->flags & EVENT_FILE_FL_FREED) in event_file_put()
1281 if (refcount_dec_and_test(&file->ref)) { in event_file_put()
1283 if (WARN_ON_ONCE(!(file->flags & EVENT_FILE_FL_FREED))) in event_file_put()
1291 eventfs_remove_dir(file->ei); in remove_event_file_dir()
1292 list_del(&file->list); in remove_event_file_dir()
1293 remove_subsystem(file->system); in remove_event_file_dir()
1294 free_event_filter(file->filter); in remove_event_file_dir()
1295 file->flags |= EVENT_FILE_FL_FREED; in remove_event_file_dir()
1311 int ret = -EINVAL; in __ftrace_set_clr_event_nolock()
1319 return -ENOMEM; in __ftrace_set_clr_event_nolock()
1321 /* Replace all '-' with '_' as that's what modules do */ in __ftrace_set_clr_event_nolock()
1322 for (p = strchr(module, '-'); p; p = strchr(p + 1, '-')) in __ftrace_set_clr_event_nolock()
1326 list_for_each_entry(file, &tr->events, list) { in __ftrace_set_clr_event_nolock()
1328 call = file->event_call; in __ftrace_set_clr_event_nolock()
1331 if (module && (!call->module || strcmp(module_name(call->module), module))) in __ftrace_set_clr_event_nolock()
1336 if (!name || !call->class || !call->class->reg) in __ftrace_set_clr_event_nolock()
1339 if (call->flags & TRACE_EVENT_FL_IGNORE_ENABLE) in __ftrace_set_clr_event_nolock()
1344 strcmp(match, call->class->system) != 0) in __ftrace_set_clr_event_nolock()
1347 if (sub && strcmp(sub, call->class->system) != 0) in __ftrace_set_clr_event_nolock()
1370 if (module && ret == -EINVAL && !eret) in __ftrace_set_clr_event_nolock()
1395 return -ENOENT; in ftrace_set_clr_event()
1406 * The buf format can be <subsystem>:<event-name> in ftrace_set_clr_event()
1407 * *:<event-name> means any event by that name. in ftrace_set_clr_event()
1408 * :<event-name> is the same. in ftrace_set_clr_event()
1437 *(buf - 1) = ':'; in ftrace_set_clr_event()
1443 * trace_set_clr_event - enable or disable an event
1451 * Returns 0 on success, -EINVAL if the parameters do not match any
1459 return -ENODEV; in trace_set_clr_event()
1466 * trace_array_set_clr_event - enable or disable an event for a trace array.
1475 * Returns 0 on success, -EINVAL if the parameters do not match any
1484 return -ENOENT; in trace_array_set_clr_event()
1499 struct seq_file *m = file->private_data; in ftrace_event_write() local
1500 struct trace_array *tr = m->private; in ftrace_event_write()
1511 return -ENOMEM; in ftrace_event_write()
1535 t_next(struct seq_file *m, void *v, loff_t *pos) in t_next() argument
1539 struct trace_array *tr = m->private; in t_next()
1543 list_for_each_entry_continue(file, &tr->events, list) { in t_next()
1544 call = file->event_call; in t_next()
1549 if (call->class && call->class->reg && in t_next()
1550 !(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)) in t_next()
1557 static void *t_start(struct seq_file *m, loff_t *pos) in t_start() argument
1560 struct trace_array *tr = m->private; in t_start()
1565 file = list_entry(&tr->events, struct trace_event_file, list); in t_start()
1567 file = t_next(m, file, &l); in t_start()
1588 s_next(struct seq_file *m, void *v, loff_t *pos) in s_next() argument
1592 struct trace_array *tr = m->private; in s_next()
1596 if (iter->type == SET_EVENT_FILE) { in s_next()
1597 file = iter->file; in s_next()
1598 list_for_each_entry_continue(file, &tr->events, list) { in s_next()
1599 if (file->flags & EVENT_FILE_FL_ENABLED) { in s_next()
1600 iter->file = file; in s_next()
1605 iter->type = SET_EVENT_MOD; in s_next()
1606 iter->event_mod = list_entry(&tr->mod_events, struct event_mod_load, list); in s_next()
1611 list_for_each_entry_continue(iter->event_mod, &tr->mod_events, list) in s_next()
1625 static void *s_start(struct seq_file *m, loff_t *pos) in s_start() argument
1627 struct trace_array *tr = m->private; in s_start()
1636 iter->type = SET_EVENT_FILE; in s_start()
1637 iter->file = list_entry(&tr->events, struct trace_event_file, list); in s_start()
1640 iter = s_next(m, iter, &l); in s_start()
1647 static int t_show(struct seq_file *m, void *v) in t_show() argument
1650 struct trace_event_call *call = file->event_call; in t_show()
1652 if (strcmp(call->class->system, TRACE_SYSTEM) != 0) in t_show()
1653 seq_printf(m, "%s:", call->class->system); in t_show()
1654 seq_printf(m, "%s\n", trace_event_name(call)); in t_show()
1659 static void t_stop(struct seq_file *m, void *p) in t_stop() argument
1665 static int s_show(struct seq_file *m, void *v) in s_show() argument
1671 if (iter->type == SET_EVENT_FILE) in s_show()
1672 return t_show(m, iter->file); in s_show()
1675 if (iter->event_mod->match) { in s_show()
1676 seq_printf(m, "%s:mod:%s\n", iter->event_mod->match, in s_show()
1677 iter->event_mod->module); in s_show()
1681 system = iter->event_mod->system ? : "*"; in s_show()
1682 event = iter->event_mod->event ? : "*"; in s_show()
1684 seq_printf(m, "%s:%s:mod:%s\n", system, event, iter->event_mod->module); in s_show()
1689 static int s_show(struct seq_file *m, void *v) in s_show() argument
1693 return t_show(m, iter->file); in s_show()
1697 static void s_stop(struct seq_file *m, void *v) in s_stop() argument
1700 t_stop(m, NULL); in s_stop()
1704 __next(struct seq_file *m, void *v, loff_t *pos, int type) in __next() argument
1706 struct trace_array *tr = m->private; in __next()
1710 pid_list = rcu_dereference_sched(tr->filtered_pids); in __next()
1712 pid_list = rcu_dereference_sched(tr->filtered_no_pids); in __next()
1718 p_next(struct seq_file *m, void *v, loff_t *pos) in p_next() argument
1720 return __next(m, v, pos, TRACE_PIDS); in p_next()
1724 np_next(struct seq_file *m, void *v, loff_t *pos) in np_next() argument
1726 return __next(m, v, pos, TRACE_NO_PIDS); in np_next()
1729 static void *__start(struct seq_file *m, loff_t *pos, int type) in __start() argument
1733 struct trace_array *tr = m->private; in __start()
1737 * tr->filtered_pids as p_start() has. in __start()
1738 * If we just passed the tr->filtered_pids around, then RCU would in __start()
1745 pid_list = rcu_dereference_sched(tr->filtered_pids); in __start()
1747 pid_list = rcu_dereference_sched(tr->filtered_no_pids); in __start()
1755 static void *p_start(struct seq_file *m, loff_t *pos) in p_start() argument
1758 return __start(m, pos, TRACE_PIDS); in p_start()
1761 static void *np_start(struct seq_file *m, loff_t *pos) in np_start() argument
1764 return __start(m, pos, TRACE_NO_PIDS); in np_start()
1767 static void p_stop(struct seq_file *m, void *p) in p_stop() argument
1785 flags = file->flags; in event_enable_read()
1789 return -ENODEV; in event_enable_read()
1795 if (atomic_read(&file->sm_ref) != 0) in event_enable_read()
1822 return -ENODEV; in event_enable_write()
1823 ret = tracing_update_buffers(file->tr); in event_enable_write()
1832 return -EINVAL; in event_enable_write()
1855 list_for_each_entry(file, &tr->events, list) { in trace_events_enabled()
1856 call = file->event_call; in trace_events_enabled()
1857 if ((call->flags & TRACE_EVENT_FL_IGNORE_ENABLE) || in trace_events_enabled()
1858 !trace_event_name(call) || !call->class || !call->class->reg) in trace_events_enabled()
1861 if (system && strcmp(call->class->system, system) != 0) in trace_events_enabled()
1869 set |= (1 << !!(file->flags & EVENT_FILE_FL_ENABLED)); in trace_events_enabled()
1886 struct trace_subsystem_dir *dir = filp->private_data; in system_enable_read()
1887 struct event_subsystem *system = dir->subsystem; in system_enable_read()
1888 struct trace_array *tr = dir->tr; in system_enable_read()
1893 set = trace_events_enabled(tr, system ? system->name : NULL); in system_enable_read()
1907 struct trace_subsystem_dir *dir = filp->private_data; in system_enable_write()
1908 struct event_subsystem *system = dir->subsystem; in system_enable_write()
1917 ret = tracing_update_buffers(dir->tr); in system_enable_write()
1922 return -EINVAL; in system_enable_write()
1929 name = system->name; in system_enable_write()
1931 ret = __ftrace_set_clr_event(dir->tr, NULL, name, NULL, val, NULL); in system_enable_write()
1949 static void *f_next(struct seq_file *m, void *v, loff_t *pos) in f_next() argument
1951 struct trace_event_file *file = event_file_data(m->private); in f_next()
1952 struct trace_event_call *call = file->event_call; in f_next()
1973 node = node->prev; in f_next()
1982 static int f_show(struct seq_file *m, void *v) in f_show() argument
1984 struct trace_event_file *file = event_file_data(m->private); in f_show()
1985 struct trace_event_call *call = file->event_call; in f_show()
1991 seq_printf(m, "name: %s\n", trace_event_name(call)); in f_show()
1992 seq_printf(m, "ID: %d\n", call->event.type); in f_show()
1993 seq_puts(m, "format:\n"); in f_show()
1997 seq_putc(m, '\n'); in f_show()
2001 seq_printf(m, "\nprint fmt: %s\n", in f_show()
2002 call->print_fmt); in f_show()
2014 array_descriptor = strchr(field->type, '['); in f_show()
2016 if (str_has_prefix(field->type, "__data_loc")) in f_show()
2020 seq_printf(m, "\tfield:%s %s;\toffset:%u;\tsize:%u;\tsigned:%d;\n", in f_show()
2021 field->type, field->name, field->offset, in f_show()
2022 field->size, !!field->is_signed); in f_show()
2023 else if (field->len) in f_show()
2024 seq_printf(m, "\tfield:%.*s %s[%d];\toffset:%u;\tsize:%u;\tsigned:%d;\n", in f_show()
2025 (int)(array_descriptor - field->type), in f_show()
2026 field->type, field->name, in f_show()
2027 field->len, field->offset, in f_show()
2028 field->size, !!field->is_signed); in f_show()
2030 seq_printf(m, "\tfield:%.*s %s[];\toffset:%u;\tsize:%u;\tsigned:%d;\n", in f_show()
2031 (int)(array_descriptor - field->type), in f_show()
2032 field->type, field->name, in f_show()
2033 field->offset, field->size, !!field->is_signed); in f_show()
2038 static void *f_start(struct seq_file *m, loff_t *pos) in f_start() argument
2044 /* ->stop() is called even if ->start() fails */ in f_start()
2046 file = event_file_file(m->private); in f_start()
2048 return ERR_PTR(-ENODEV); in f_start()
2051 p = f_next(m, p, &l); in f_start()
2056 static void f_stop(struct seq_file *m, void *p) in f_stop() argument
2070 struct seq_file *m; in trace_format_open() local
2079 m = file->private_data; in trace_format_open()
2080 m->private = file; in trace_format_open()
2094 return -ENODEV; in event_id_read()
2108 int r = -ENODEV; in event_filter_read()
2116 return -ENOMEM; in event_filter_read()
2128 s->buffer, trace_seq_used(s)); in event_filter_read()
2141 int err = -ENODEV; in event_filter_write()
2144 return -EINVAL; in event_filter_write()
2153 if (file->flags & EVENT_FILE_FL_FREED) in event_filter_write()
2154 err = -ENODEV; in event_filter_write()
2179 return -ENODEV; in subsystem_open()
2185 list_for_each_entry(iter_dir, &iter_tr->systems, list) { in subsystem_open()
2186 if (iter_dir == inode->i_private) { in subsystem_open()
2190 if (dir->nr_events) { in subsystem_open()
2192 system = dir->subsystem; in subsystem_open()
2203 return -ENODEV; in subsystem_open()
2208 return -ENODEV; in subsystem_open()
2223 struct trace_array *tr = inode->i_private; in system_tr_open()
2229 return -ENOMEM; in system_tr_open()
2236 dir->tr = tr; in system_tr_open()
2237 filp->private_data = dir; in system_tr_open()
2244 struct trace_subsystem_dir *dir = file->private_data; in subsystem_release()
2246 trace_array_put(dir->tr); in subsystem_release()
2249 * If dir->subsystem is NULL, then this is a temporary in subsystem_release()
2253 if (dir->subsystem) in subsystem_release()
2265 struct trace_subsystem_dir *dir = filp->private_data; in subsystem_filter_read()
2266 struct event_subsystem *system = dir->subsystem; in subsystem_filter_read()
2275 return -ENOMEM; in subsystem_filter_read()
2281 s->buffer, trace_seq_used(s)); in subsystem_filter_read()
2292 struct trace_subsystem_dir *dir = filp->private_data; in subsystem_filter_write()
2297 return -EINVAL; in subsystem_filter_write()
2316 struct trace_array *tr = filp->private_data; in show_header_page_file()
2325 return -ENOMEM; in show_header_page_file()
2329 ring_buffer_print_page_header(tr->array_buffer.buffer, s); in show_header_page_file()
2331 s->buffer, trace_seq_used(s)); in show_header_page_file()
2349 return -ENOMEM; in show_header_event_file()
2355 s->buffer, trace_seq_used(s)); in show_header_event_file()
2372 pid_list = rcu_dereference_protected(tr->filtered_pids, in ignore_task_cpu()
2374 no_pid_list = rcu_dereference_protected(tr->filtered_no_pids, in ignore_task_cpu()
2377 this_cpu_write(tr->array_buffer.data->ignore_pid, in ignore_task_cpu()
2414 struct seq_file *m = filp->private_data; in event_pid_write() local
2415 struct trace_array *tr = m->private; in event_pid_write()
2432 filtered_pids = rcu_dereference_protected(tr->filtered_pids, in event_pid_write()
2434 other_pids = rcu_dereference_protected(tr->filtered_no_pids, in event_pid_write()
2437 filtered_pids = rcu_dereference_protected(tr->filtered_no_pids, in event_pid_write()
2439 other_pids = rcu_dereference_protected(tr->filtered_pids, in event_pid_write()
2448 rcu_assign_pointer(tr->filtered_pids, pid_list); in event_pid_write()
2450 rcu_assign_pointer(tr->filtered_no_pids, pid_list); in event_pid_write()
2452 list_for_each_entry(file, &tr->events, list) { in event_pid_write()
2453 set_bit(EVENT_FILE_FL_PID_FILTER_BIT, &file->flags); in event_pid_write()
2626 struct seq_file *m; in ftrace_event_open() local
2636 m = file->private_data; in ftrace_event_open()
2638 m->private = inode->i_private; in ftrace_event_open()
2645 struct trace_array *tr = inode->i_private; in ftrace_event_release()
2665 struct trace_array *tr = inode->i_private; in ftrace_event_set_open()
2672 if ((file->f_mode & FMODE_WRITE) && in ftrace_event_set_open()
2673 (file->f_flags & O_TRUNC)) in ftrace_event_set_open()
2686 struct trace_array *tr = inode->i_private; in ftrace_event_set_pid_open()
2693 if ((file->f_mode & FMODE_WRITE) && in ftrace_event_set_pid_open()
2694 (file->f_flags & O_TRUNC)) in ftrace_event_set_pid_open()
2707 struct trace_array *tr = inode->i_private; in ftrace_event_set_npid_open()
2714 if ((file->f_mode & FMODE_WRITE) && in ftrace_event_set_npid_open()
2715 (file->f_flags & O_TRUNC)) in ftrace_event_set_npid_open()
2734 system->ref_count = 1; in create_new_subsystem()
2737 system->name = kstrdup_const(name, GFP_KERNEL); in create_new_subsystem()
2738 if (!system->name) in create_new_subsystem()
2741 system->filter = kzalloc(sizeof(struct event_filter), GFP_KERNEL); in create_new_subsystem()
2742 if (!system->filter) in create_new_subsystem()
2745 list_add(&system->list, &event_subsystems); in create_new_subsystem()
2750 kfree_const(system->name); in create_new_subsystem()
2791 list_for_each_entry(dir, &tr->systems, list) { in event_subsystem_dir()
2792 system = dir->subsystem; in event_subsystem_dir()
2793 if (strcmp(system->name, name) == 0) { in event_subsystem_dir()
2794 dir->nr_events++; in event_subsystem_dir()
2795 file->system = dir; in event_subsystem_dir()
2796 return dir->ei; in event_subsystem_dir()
2803 if (strcmp(iter->name, name) == 0) { in event_subsystem_dir()
2833 dir->ei = ei; in event_subsystem_dir()
2834 dir->tr = tr; in event_subsystem_dir()
2835 dir->ref_count = 1; in event_subsystem_dir()
2836 dir->nr_events = 1; in event_subsystem_dir()
2837 dir->subsystem = system; in event_subsystem_dir()
2838 file->system = dir; in event_subsystem_dir()
2840 list_add(&dir->list, &tr->systems); in event_subsystem_dir()
2842 return dir->ei; in event_subsystem_dir()
2860 * Other events may have the same class. Only update in event_define_fields()
2865 struct trace_event_fields *field = call->class->fields_array; in event_define_fields()
2868 for (; field->type; field++) { in event_define_fields()
2869 if (field->type == TRACE_FUNCTION_TYPE) { in event_define_fields()
2870 field->define_fields(call); in event_define_fields()
2874 offset = ALIGN(offset, field->align); in event_define_fields()
2875 ret = trace_define_field_ext(call, field->type, field->name, in event_define_fields()
2876 offset, field->size, in event_define_fields()
2877 field->is_signed, field->filter_type, in event_define_fields()
2878 field->len, field->needs_test); in event_define_fields()
2884 offset += field->size; in event_define_fields()
2895 struct trace_event_call *call = file->event_call; in event_callback()
2908 if (!(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)) { in event_callback()
2909 if (call->class->reg && strcmp(name, "enable") == 0) { in event_callback()
2922 if (!(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE) || in event_callback()
2932 if (call->event.type && call->class->reg && in event_callback()
2935 *data = (void *)(long)call->event.type; in event_callback()
2956 if (call->event.type && call->class->reg && in event_callback()
2977 struct trace_event_call *call = file->event_call; in event_create_dir()
2978 struct trace_array *tr = file->tr; in event_create_dir()
3033 if (WARN_ON_ONCE(strcmp(call->class->system, TRACE_SYSTEM) == 0)) in event_create_dir()
3034 return -ENODEV; in event_create_dir()
3036 e_events = event_subsystem_dir(tr, call->class->system, file, parent); in event_create_dir()
3038 return -ENOMEM; in event_create_dir()
3046 return -1; in event_create_dir()
3049 file->ei = ei; in event_create_dir()
3069 if (file->event_call != call) in remove_event_from_tracers()
3089 if (file->event_call != call) in event_remove()
3092 if (file->flags & EVENT_FILE_FL_WAS_ENABLED) in event_remove()
3093 tr->clear_trace = true; in event_remove()
3105 if (call->event.funcs) in event_remove()
3106 __unregister_trace_event(&call->event); in event_remove()
3108 list_del(&call->list); in event_remove()
3118 return -EINVAL; in event_init()
3120 if (call->class->raw_init) { in event_init()
3121 ret = call->class->raw_init(call); in event_init()
3122 if (ret < 0 && ret != -ENOSYS) in event_init()
3139 list_add(&call->list, &ftrace_events); in __register_event()
3142 if (call->flags & TRACE_EVENT_FL_DYNAMIC) in __register_event()
3143 atomic_set(&call->refcnt, 0); in __register_event()
3145 call->module = mod; in __register_event()
3156 elen = snprintf(ptr, 0, "%ld", map->eval_value); in eval_replace()
3161 snprintf(ptr, elen + 1, "%ld", map->eval_value); in eval_replace()
3177 int len = strlen(map->eval_string); in update_event_printk()
3179 for (ptr = call->print_fmt; *ptr; ptr++) { in update_event_printk()
3208 if (strncmp(map->eval_string, ptr, len) == 0 && in update_event_printk()
3231 * '->' then we can continue to ignore that string. in update_event_printk()
3233 if (*ptr == '.' || (ptr[0] == '-' && ptr[1] == '>')) { in update_event_printk()
3263 modstr->module = module; in add_str_to_module()
3264 modstr->str = str; in add_str_to_module()
3266 list_add(&modstr->next, &module_strings); in add_str_to_module()
3270 #define ATTRIBUTE_STR_LEN (sizeof(ATTRIBUTE_STR) - 1)
3281 if (attr != next && !isspace(attr[-1])) { in sanitize_field_type()
3290 attr = ret + (attr - type); in sanitize_field_type()
3307 depth--; in sanitize_field_type()
3350 if (call->flags & TRACE_EVENT_FL_DYNAMIC) in update_event_fields()
3354 eval_string = map->eval_string; in update_event_fields()
3355 len = strlen(map->eval_string); in update_event_fields()
3360 str = sanitize_field_type(field->type); in update_event_fields()
3366 if (str == field->type) { in update_event_fields()
3367 str = kstrdup(field->type, GFP_KERNEL); in update_event_fields()
3370 ptr = str + (ptr - field->type); in update_event_fields()
3381 if (str == field->type) in update_event_fields()
3388 if (call->module) in update_event_fields()
3389 add_str_to_module(call->module, str); in update_event_fields()
3391 field->type = str; in update_event_fields()
3392 if (field->filter_type == FILTER_OTHER) in update_event_fields()
3393 field->filter_type = filter_assign_type(field->type); in update_event_fields()
3410 if (!last_system || call->class->system != last_system) { in trace_event_update_all()
3413 last_system = call->class->system; in trace_event_update_all()
3428 if (call->class->system == map[i]->system) { in trace_event_update_all()
3456 system = call->class->system; in event_in_systems()
3461 if (p != systems && !isspace(*(p - 1)) && *(p - 1) != ',') in event_in_systems()
3491 if (!event_in_systems(call, tr->system_names)) in trace_create_new_event()
3496 return ERR_PTR(-ENOMEM); in trace_create_new_event()
3498 pid_list = rcu_dereference_protected(tr->filtered_pids, in trace_create_new_event()
3500 no_pid_list = rcu_dereference_protected(tr->filtered_no_pids, in trace_create_new_event()
3505 file->flags |= EVENT_FILE_FL_PID_FILTER; in trace_create_new_event()
3507 file->event_call = call; in trace_create_new_event()
3508 file->tr = tr; in trace_create_new_event()
3509 atomic_set(&file->sm_ref, 0); in trace_create_new_event()
3510 atomic_set(&file->tm_ref, 0); in trace_create_new_event()
3511 INIT_LIST_HEAD(&file->triggers); in trace_create_new_event()
3512 list_add(&file->list, &tr->events); in trace_create_new_event()
3513 refcount_set(&file->ref, 1); in trace_create_new_event()
3562 * trace_create_new_event() returns ERR_PTR(-ENOMEM) if failed in __trace_add_new_event()
3563 * allocation, or NULL if the event is not part of the tr->system_names. in __trace_add_new_event()
3564 * When the event is not part of the tr->system_names, return zero, not in __trace_add_new_event()
3574 return event_create_dir(tr->event_dir, file); in __trace_add_new_event()
3611 * trace_create_new_event() returns ERR_PTR(-ENOMEM) if failed in __trace_early_add_new_event()
3612 * allocation, or NULL if the event is not part of the tr->system_names. in __trace_early_add_new_event()
3613 * When the event is not part of the tr->system_names, return zero, not in __trace_early_add_new_event()
3667 if (call->perf_refcount) in probe_remove_event_call()
3668 return -EBUSY; in probe_remove_event_call()
3671 if (file->event_call != call) in probe_remove_event_call()
3678 if (file->flags & EVENT_FILE_FL_ENABLED) in probe_remove_event_call()
3681 if (file->flags & EVENT_FILE_FL_WAS_ENABLED) in probe_remove_event_call()
3682 tr->clear_trace = true; in probe_remove_event_call()
3698 tr->clear_trace = false; in probe_remove_event_call()
3700 return -EBUSY; in probe_remove_event_call()
3730 list_for_each_entry_safe(event_mod, n, &tr->mod_events, list) { in update_mod_cache()
3731 if (strcmp(event_mod->module, mod->name) != 0) in update_mod_cache()
3734 __ftrace_set_clr_event_nolock(tr, event_mod->match, in update_mod_cache()
3735 event_mod->system, in update_mod_cache()
3736 event_mod->event, 1, mod->name); in update_mod_cache()
3753 if (!mod->num_trace_events) in trace_module_add_events()
3759 mod->name); in trace_module_add_events()
3763 start = mod->trace_events; in trace_module_add_events()
3764 end = mod->trace_events + mod->num_trace_events; in trace_module_add_events()
3777 struct module_string *modstr, *m; in trace_module_remove_events() local
3781 if ((call->flags & TRACE_EVENT_FL_DYNAMIC) || !call->module) in trace_module_remove_events()
3783 if (call->module == mod) in trace_module_remove_events()
3787 list_for_each_entry_safe(modstr, m, &module_strings, next) { in trace_module_remove_events()
3788 if (modstr->module != mod) in trace_module_remove_events()
3790 list_del(&modstr->next); in trace_module_remove_events()
3791 kfree(modstr->str); in trace_module_remove_events()
3859 list_for_each_entry(file, &tr->events, list) { in __find_event_file()
3861 call = file->event_call; in __find_event_file()
3864 if (!name || !call->class) in __find_event_file()
3868 strcmp(system, call->class->system) == 0) in __find_event_file()
3881 if (!file || !file->event_call->class->reg || in find_event_file()
3882 file->event_call->flags & TRACE_EVENT_FL_IGNORE_ENABLE) in find_event_file()
3889 * trace_get_event_file - Find and return a trace event file
3896 * refers to the top-level trace array.
3914 int ret = -EINVAL; in trace_get_event_file()
3919 return ERR_PTR(-ENOENT); in trace_get_event_file()
3931 return ERR_PTR(-EINVAL); in trace_get_event_file()
3935 ret = trace_event_try_get_ref(file->event_call); in trace_get_event_file()
3938 return ERR_PTR(-EBUSY); in trace_get_event_file()
3946 * trace_put_event_file - Release a file from trace_get_event_file()
3957 trace_event_put_ref(file->event_call); in trace_put_event_file()
3960 trace_array_put(file->tr); in trace_put_event_file()
3979 if (data->enable) in update_event_probe()
3980 clear_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &data->file->flags); in update_event_probe()
3982 set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &data->file->flags); in update_event_probe()
4017 if (!edata->count) in event_enable_count_probe()
4021 if (edata->enable == !(edata->file->flags & EVENT_FILE_FL_SOFT_DISABLED)) in event_enable_count_probe()
4024 if (edata->count != -1) in event_enable_count_probe()
4025 (edata->count)--; in event_enable_count_probe()
4031 event_enable_print(struct seq_file *m, unsigned long ip, in event_enable_print() argument
4045 seq_printf(m, "%ps:", (void *)ip); in event_enable_print()
4047 seq_printf(m, "%s:%s:%s", in event_enable_print()
4048 edata->enable ? ENABLE_EVENT_STR : DISABLE_EVENT_STR, in event_enable_print()
4049 edata->file->event_call->class->system, in event_enable_print()
4050 trace_event_name(edata->file->event_call)); in event_enable_print()
4052 if (edata->count == -1) in event_enable_print()
4053 seq_puts(m, ":unlimited\n"); in event_enable_print()
4055 seq_printf(m, ":count=%ld\n", edata->count); in event_enable_print()
4071 return -ENODEV; in event_enable_init()
4079 edata->ref++; in event_enable_init()
4088 edata->ref--; in free_probe_data()
4089 if (!edata->ref) { in free_probe_data()
4091 __ftrace_event_enable_disable(edata->file, 0, 1); in free_probe_data()
4092 trace_event_put_ref(edata->file->event_call); in free_probe_data()
4117 if (WARN_ON_ONCE(edata->ref <= 0)) in event_enable_free()
4158 unsigned long count = -1; in event_enable_func()
4166 return -ENODEV; in event_enable_func()
4170 return -EINVAL; in event_enable_func()
4174 return -EINVAL; in event_enable_func()
4182 return -EINVAL; in event_enable_func()
4198 return -EINVAL; in event_enable_func()
4210 ret = trace_event_try_get_ref(file->event_call); in event_enable_func()
4212 return -EBUSY; in event_enable_func()
4218 ret = -ENOMEM; in event_enable_func()
4223 data->enable = enable; in event_enable_func()
4224 data->count = count; in event_enable_func()
4225 data->file = file; in event_enable_func()
4241 ret = -ENOENT; in event_enable_func()
4245 trace_event_put_ref(file->event_call); in event_enable_func()
4276 * The top level array and trace arrays created by boot-time tracing
4288 list_for_each_entry(file, &tr->events, list) { in __trace_early_add_event_dirs()
4289 ret = event_create_dir(tr->event_dir, file); in __trace_early_add_event_dirs()
4292 trace_event_name(file->event_call)); in __trace_early_add_event_dirs()
4298 * by boot-time tracing require to have a list of events that can be
4309 if (!(call->flags & TRACE_EVENT_FL_DYNAMIC) && in __trace_early_add_events()
4310 WARN_ON_ONCE(call->module)) in __trace_early_add_events()
4326 list_for_each_entry_safe(file, next, &tr->events, list) in __trace_remove_event_dirs()
4400 return -ENOMEM; in create_event_toplevel_files()
4408 return -ENOMEM; in create_event_toplevel_files()
4420 tr->event_dir = e_events; in create_event_toplevel_files()
4426 * event_trace_add_tracer - add a instance of a trace_array to events
4450 if (unlikely(!list_empty(&tr->events))) in event_trace_add_tracer()
4487 /* Disable any event triggers and associated soft-disabled events */ in event_trace_del_tracer()
4501 eventfs_remove_events_dir(tr->event_dir); in event_trace_del_tracer()
4504 tr->event_dir = NULL; in event_trace_del_tracer()
4540 *(buf - 1) = ','; in early_enable_events()
4551 return -ENODEV; in event_trace_enable()
4558 list_add(&call->list, &ftrace_events); in event_trace_enable()
4597 return -ENODEV; in event_trace_enable_again()
4625 return -ENODEV; in event_trace_init()
4701 test_thread = kthread_run(event_test_thread, NULL, "test-events"); in event_test_stuff()
4725 list_for_each_entry(file, &tr->events, list) { in event_trace_self_tests()
4727 call = file->event_call; in event_trace_self_tests()
4730 if (!call->class || !call->class->probe) in event_trace_self_tests()
4740 if (call->class->system && in event_trace_self_tests()
4741 strcmp(call->class->system, "syscalls") == 0) in event_trace_self_tests()
4751 if (file->flags & EVENT_FILE_FL_ENABLED) { in event_trace_self_tests()
4768 list_for_each_entry(dir, &tr->systems, list) { in event_trace_self_tests()
4770 system = dir->subsystem; in event_trace_self_tests()
4773 if (strcmp(system->name, "ftrace") == 0) in event_trace_self_tests()
4776 pr_info("Testing event system %s: ", system->name); in event_trace_self_tests()
4778 ret = __ftrace_set_clr_event(tr, NULL, system->name, NULL, 1, NULL); in event_trace_self_tests()
4781 system->name); in event_trace_self_tests()
4787 ret = __ftrace_set_clr_event(tr, NULL, system->name, NULL, 0, NULL); in event_trace_self_tests()
4790 system->name); in event_trace_self_tests()
4851 entry->ip = ip; in function_test_events_call()
4852 entry->parent_ip = parent_ip; in function_test_events_call()