Lines Matching +full:cmd +full:- +full:cnt +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0
3 * trace_events_trigger - trace event triggers
22 if (data->cmd_ops->set_filter) in trigger_data_free()
23 data->cmd_ops->set_filter(NULL, data, NULL); in trigger_data_free()
32 * event_triggers_call - Call triggers associated with a trace event
40 * non-NULL, it means that the trigger requires further processing and
41 * shouldn't be unconditionally invoked. If rec is non-NULL and the
66 if (list_empty(&file->triggers)) in event_triggers_call()
69 list_for_each_entry_rcu(data, &file->triggers, list) { in event_triggers_call()
70 if (data->paused) in event_triggers_call()
73 data->ops->trigger(data, buffer, rec, event); in event_triggers_call()
76 filter = rcu_dereference_sched(data->filter); in event_triggers_call()
79 if (event_command_post_trigger(data->cmd_ops)) { in event_triggers_call()
80 tt |= data->cmd_ops->trigger_type; in event_triggers_call()
83 data->ops->trigger(data, buffer, rec, event); in event_triggers_call()
91 unsigned long eflags = file->flags; in __trace_trigger_soft_disabled()
104 * event_triggers_post_call - Call 'post_triggers' for a trace event
121 list_for_each_entry_rcu(data, &file->triggers, list) { in event_triggers_post_call()
122 if (data->paused) in event_triggers_post_call()
124 if (data->cmd_ops->trigger_type & tt) in event_triggers_post_call()
125 data->ops->trigger(data, NULL, NULL, NULL); in event_triggers_post_call()
134 struct trace_event_file *event_file = event_file_data(m->private); in trigger_next()
140 return seq_list_next(t, &event_file->triggers, pos); in trigger_next()
147 list_for_each_entry_rcu(data, &file->triggers, list, in check_user_trigger()
149 if (data->flags & EVENT_TRIGGER_FL_PROBE) in check_user_trigger()
160 /* ->stop() is called even if ->start() fails */ in trigger_start()
162 event_file = event_file_file(m->private); in trigger_start()
164 return ERR_PTR(-ENODEV); in trigger_start()
166 if (list_empty(&event_file->triggers) || !check_user_trigger(event_file)) in trigger_start()
169 return seq_list_start(&event_file->triggers, *pos); in trigger_start()
187 seq_printf(m, " %s", p->name); in trigger_show()
194 data->ops->print(m, data); in trigger_show()
217 return -ENODEV; in event_trigger_regex_open()
219 if ((file->f_mode & FMODE_WRITE) && in event_trigger_regex_open()
220 (file->f_flags & O_TRUNC)) { in event_trigger_regex_open()
227 if (p->unreg_all) in event_trigger_regex_open()
228 p->unreg_all(event_file); in event_trigger_regex_open()
232 if (file->f_mode & FMODE_READ) { in event_trigger_regex_open()
235 struct seq_file *m = file->private_data; in event_trigger_regex_open()
236 m->private = file; in event_trigger_regex_open()
260 if (strcmp(p->name, command) == 0) in trigger_process_regex()
261 return p->parse(p, file, buff, command, next); in trigger_process_regex()
264 return -EINVAL; in trigger_process_regex()
269 size_t cnt, loff_t *ppos) in event_trigger_regex_write() argument
275 if (!cnt) in event_trigger_regex_write()
278 if (cnt >= PAGE_SIZE) in event_trigger_regex_write()
279 return -EINVAL; in event_trigger_regex_write()
281 buf = memdup_user_nul(ubuf, cnt); in event_trigger_regex_write()
291 return -ENODEV; in event_trigger_regex_write()
297 *ppos += cnt; in event_trigger_regex_write()
298 return cnt; in event_trigger_regex_write()
305 if (file->f_mode & FMODE_READ) in event_trigger_regex_release()
315 size_t cnt, loff_t *ppos) in event_trigger_write() argument
317 return event_trigger_regex_write(filp, ubuf, cnt, ppos); in event_trigger_write()
345 __init int register_event_command(struct event_command *cmd) in register_event_command() argument
352 if (strcmp(cmd->name, p->name) == 0) in register_event_command()
353 return -EBUSY; in register_event_command()
355 list_add(&cmd->list, &trigger_commands); in register_event_command()
364 __init int unregister_event_command(struct event_command *cmd) in unregister_event_command() argument
371 if (strcmp(cmd->name, p->name) == 0) { in unregister_event_command()
372 list_del_init(&p->list); in unregister_event_command()
377 return -ENODEV; in unregister_event_command()
381 * event_trigger_print - Generic event_trigger_ops @print implementation
382 * @name: The name of the event trigger
384 * @data: Trigger-specific data
389 * Usually wrapped by a function that simply sets the @name of the
395 event_trigger_print(const char *name, struct seq_file *m, in event_trigger_print() argument
400 seq_puts(m, name); in event_trigger_print()
402 if (count == -1) in event_trigger_print()
416 * event_trigger_init - Generic event_trigger_ops @init implementation
417 * @data: Trigger-specific data
428 data->ref++; in event_trigger_init()
433 * event_trigger_free - Generic event_trigger_ops @free implementation
434 * @data: Trigger-specific data
436 * Common implementation of event trigger de-initialization.
444 if (WARN_ON_ONCE(data->ref <= 0)) in event_trigger_free()
447 data->ref--; in event_trigger_free()
448 if (!data->ref) in event_trigger_free()
458 if (atomic_inc_return(&file->tm_ref) > 1) in trace_event_trigger_enable_disable()
460 set_bit(EVENT_FILE_FL_TRIGGER_MODE_BIT, &file->flags); in trace_event_trigger_enable_disable()
463 if (atomic_dec_return(&file->tm_ref) > 0) in trace_event_trigger_enable_disable()
465 clear_bit(EVENT_FILE_FL_TRIGGER_MODE_BIT, &file->flags); in trace_event_trigger_enable_disable()
473 * clear_event_triggers - Clear all triggers associated with a trace array
479 * decremented via free()->trace_event_enable_disable(). That
480 * combination effectively reverses the soft-mode/trigger state added
490 list_for_each_entry(file, &tr->events, list) { in clear_event_triggers()
492 list_for_each_entry_safe(data, n, &file->triggers, list) { in clear_event_triggers()
494 list_del_rcu(&data->list); in clear_event_triggers()
495 if (data->ops->free) in clear_event_triggers()
496 data->ops->free(data); in clear_event_triggers()
502 * update_cond_flag - Set or reset the TRIGGER_COND bit
518 list_for_each_entry(data, &file->triggers, list) { in update_cond_flag()
519 if (data->filter || event_command_post_trigger(data->cmd_ops) || in update_cond_flag()
520 event_command_needs_rec(data->cmd_ops)) { in update_cond_flag()
527 set_bit(EVENT_FILE_FL_TRIGGER_COND_BIT, &file->flags); in update_cond_flag()
529 clear_bit(EVENT_FILE_FL_TRIGGER_COND_BIT, &file->flags); in update_cond_flag()
533 * register_trigger - Generic event_command @reg implementation
535 * @data: Trigger-specific data to associate with the trigger
554 list_for_each_entry(test, &file->triggers, list) { in register_trigger()
555 if (test->cmd_ops->trigger_type == data->cmd_ops->trigger_type) in register_trigger()
556 return -EEXIST; in register_trigger()
559 if (data->ops->init) { in register_trigger()
560 ret = data->ops->init(data); in register_trigger()
565 list_add_rcu(&data->list, &file->triggers); in register_trigger()
570 list_del_rcu(&data->list); in register_trigger()
587 list_for_each_entry(iter, &file->triggers, list) { in try_unregister_trigger()
588 if (iter->cmd_ops->trigger_type == test->cmd_ops->trigger_type) { in try_unregister_trigger()
590 list_del_rcu(&data->list); in try_unregister_trigger()
598 if (data->ops->free) in try_unregister_trigger()
599 data->ops->free(data); in try_unregister_trigger()
608 * unregister_trigger - Generic event_command @unreg implementation
610 * @test: Trigger-specific data used to find the trigger to remove
641 * cmd - the trigger command name
642 * glob - the trigger command name optionally prefaced with '!'
643 * param_and_filter - text following cmd and ':'
644 * param - text following cmd and ':' and stripped of filter
645 * filter - the optional filter text following (and including) 'if'
651 * - 'traceon' is both cmd and glob
652 * - '5 if pid == 0' is the param_and_filter
653 * - '5' is the param
654 * - 'if pid == 0' is the filter
657 * - 'enable_event' is both cmd and glob
658 * - 'sys:event:n' is the param_and_filter
659 * - 'sys:event:n' is the param
660 * - there is no filter
663 * - 'hist' is both cmd and glob
664 * - 'keys=pid if prio > 50' is the param_and_filter
665 * - 'keys=pid' is the param
666 * - 'if prio > 50' is the filter
669 * - 'enable_event' the cmd
670 * - '!enable_event' is the glob
671 * - 'sys:event:n' is the param_and_filter
672 * - 'sys:event:n' is the param
673 * - there is no filter
676 * - 'traceoff' is both cmd and glob
677 * - there is no param_and_filter
678 * - there is no param
679 * - there is no filter
684 * - triggers that don't require a parameter e.g. traceon
685 * - triggers that do require a parameter e.g. enable_event and hist
686 * - triggers that though they may not require a param may support an
689 * - triggers that do not support an 'n' param e.g. hist
691 * These functions can be used or ignored as necessary - it all
701 * event_trigger_check_remove - check whether an event trigger specifies remove
705 * parameter. This is the command name either with or without a
718 * event_trigger_empty_param - check whether the param is empty
723 * name minus the command name. This function can be called by a
735 * event_trigger_separate_filter - separate an event trigger from a filter
744 * or the @filter may be set to NULL by this function - if not set to
749 * passed-in param: either the param is required, or it is not
751 * return -EINVAL. If @param_required is not set and there's a param
769 ret = -EINVAL; in event_trigger_separate_filter()
803 * trigger_data_alloc - allocate and init event_trigger_data for a trigger
805 * @cmd: The cmd string
810 * @cmd_ops are used along with the @cmd and @param to get the
819 char *cmd, in trigger_data_alloc() argument
826 trigger_ops = cmd_ops->get_trigger_ops(cmd, param); in trigger_data_alloc()
832 trigger_data->count = -1; in trigger_data_alloc()
833 trigger_data->ops = trigger_ops; in trigger_data_alloc()
834 trigger_data->cmd_ops = cmd_ops; in trigger_data_alloc()
835 trigger_data->private_data = private_data; in trigger_data_alloc()
837 INIT_LIST_HEAD(&trigger_data->list); in trigger_data_alloc()
838 INIT_LIST_HEAD(&trigger_data->named_list); in trigger_data_alloc()
839 RCU_INIT_POINTER(trigger_data->filter, NULL); in trigger_data_alloc()
845 * event_trigger_parse_num - parse and return the number param for a trigger
864 return -EINVAL; in event_trigger_parse_num()
870 ret = kstrtoul(number, 0, &trigger_data->count); in event_trigger_parse_num()
877 * event_trigger_set_filter - set an event trigger's filter
893 if (param && cmd_ops->set_filter) in event_trigger_set_filter()
894 return cmd_ops->set_filter(param, trigger_data, file); in event_trigger_set_filter()
900 * event_trigger_reset_filter - reset an event trigger's filter
909 if (cmd_ops->set_filter) in event_trigger_reset_filter()
910 cmd_ops->set_filter(NULL, trigger_data, NULL); in event_trigger_reset_filter()
914 * event_trigger_register - register an event trigger
921 * cmd_ops->reg() function which actually does the registration.
930 return cmd_ops->reg(glob, trigger_data, file); in event_trigger_register()
934 * event_trigger_unregister - unregister an event trigger
941 * cmd_ops->unreg() function which actually does the unregistration.
948 cmd_ops->unreg(glob, trigger_data, file); in event_trigger_unregister()
956 * event_trigger_parse - Generic event_command @parse implementation
960 * @cmd: The cmd portion of the string used to register the trigger
974 char *glob, char *cmd, char *param_and_filter) in event_trigger_parse() argument
987 ret = -ENOMEM; in event_trigger_parse()
988 trigger_data = trigger_data_alloc(cmd_ops, cmd, param, file); in event_trigger_parse()
1024 * set_trigger_filter - Generic event_command @set_filter implementation
1026 * @trigger_data: Trigger-specific data
1045 int ret = -EINVAL; in set_trigger_filter()
1060 ret = create_event_filter(file->tr, file->event_call, in set_trigger_filter()
1065 kfree(filter->filter_string); in set_trigger_filter()
1066 filter->filter_string = NULL; in set_trigger_filter()
1071 * Which the calling code will do with data->filter. in set_trigger_filter()
1074 tmp = rcu_access_pointer(data->filter); in set_trigger_filter()
1076 rcu_assign_pointer(data->filter, filter); in set_trigger_filter()
1090 kfree(data->filter_str); in set_trigger_filter()
1091 data->filter_str = NULL; in set_trigger_filter()
1094 data->filter_str = kstrdup(filter_str, GFP_KERNEL); in set_trigger_filter()
1095 if (!data->filter_str) { in set_trigger_filter()
1096 free_event_filter(rcu_access_pointer(data->filter)); in set_trigger_filter()
1097 data->filter = NULL; in set_trigger_filter()
1098 ret = -ENOMEM; in set_trigger_filter()
1107 * find_named_trigger - Find the common named trigger associated with @name
1108 * @name: The name of the set of named triggers to find the common data for
1111 * trigger data. The first named trigger registered with a given name
1113 * registered with the same name will reference. This function
1120 struct event_trigger_data *find_named_trigger(const char *name) in find_named_trigger() argument
1124 if (!name) in find_named_trigger()
1128 if (data->named_data) in find_named_trigger()
1130 if (strcmp(data->name, name) == 0) in find_named_trigger()
1138 * is_named_trigger - determine if a given trigger is a named trigger
1156 * save_named_trigger - save the trigger in the named trigger list
1157 * @name: The name of the named trigger set
1162 int save_named_trigger(const char *name, struct event_trigger_data *data) in save_named_trigger() argument
1164 data->name = kstrdup(name, GFP_KERNEL); in save_named_trigger()
1165 if (!data->name) in save_named_trigger()
1166 return -ENOMEM; in save_named_trigger()
1168 list_add(&data->named_list, &named_triggers); in save_named_trigger()
1174 * del_named_trigger - delete a trigger from the named trigger list
1179 kfree(data->name); in del_named_trigger()
1180 data->name = NULL; in del_named_trigger()
1182 list_del(&data->named_list); in del_named_trigger()
1190 if (strcmp(test->name, data->name) == 0) { in __pause_named_trigger()
1192 test->paused_tmp = test->paused; in __pause_named_trigger()
1193 test->paused = true; in __pause_named_trigger()
1195 test->paused = test->paused_tmp; in __pause_named_trigger()
1202 * pause_named_trigger - Pause all named triggers with the same name
1206 * same name. Because named triggers share a common set of data,
1208 * to pause all triggers with the same name.
1216 * unpause_named_trigger - Un-pause all named triggers with the same name
1219 * Un-pauses a named trigger along with all other triggers having the
1220 * same name. Because named triggers share a common set of data,
1222 * needs to unpause all triggers with the same name.
1230 * set_named_trigger_data - Associate common named trigger data
1235 * trigger data. The first named trigger registered with a given name
1237 * registered with the same name will reference. This function
1244 data->named_data = named_data; in set_named_trigger_data()
1250 return data->named_data; in get_named_trigger_data()
1258 struct trace_event_file *file = data->private_data; in traceon_trigger()
1261 if (tracer_tracing_is_on(file->tr)) in traceon_trigger()
1264 tracer_tracing_on(file->tr); in traceon_trigger()
1279 struct trace_event_file *file = data->private_data; in traceon_count_trigger()
1282 if (tracer_tracing_is_on(file->tr)) in traceon_count_trigger()
1289 if (!data->count) in traceon_count_trigger()
1292 if (data->count != -1) in traceon_count_trigger()
1293 (data->count)--; in traceon_count_trigger()
1296 tracer_tracing_on(file->tr); in traceon_count_trigger()
1306 struct trace_event_file *file = data->private_data; in traceoff_trigger()
1309 if (!tracer_tracing_is_on(file->tr)) in traceoff_trigger()
1312 tracer_tracing_off(file->tr); in traceoff_trigger()
1327 struct trace_event_file *file = data->private_data; in traceoff_count_trigger()
1330 if (!tracer_tracing_is_on(file->tr)) in traceoff_count_trigger()
1337 if (!data->count) in traceoff_count_trigger()
1340 if (data->count != -1) in traceoff_count_trigger()
1341 (data->count)--; in traceoff_count_trigger()
1344 tracer_tracing_off(file->tr); in traceoff_count_trigger()
1352 return event_trigger_print("traceon", m, (void *)data->count, in traceon_trigger_print()
1353 data->filter_str); in traceon_trigger_print()
1359 return event_trigger_print("traceoff", m, (void *)data->count, in traceoff_trigger_print()
1360 data->filter_str); in traceoff_trigger_print()
1392 onoff_get_trigger_ops(char *cmd, char *param) in onoff_get_trigger_ops() argument
1397 if (strcmp(cmd, "traceon") == 0) in onoff_get_trigger_ops()
1408 .name = "traceon",
1418 .name = "traceoff",
1434 struct trace_event_file *file = data->private_data; in snapshot_trigger()
1437 tracing_snapshot_instance(file->tr); in snapshot_trigger()
1447 if (!data->count) in snapshot_count_trigger()
1450 if (data->count != -1) in snapshot_count_trigger()
1451 (data->count)--; in snapshot_count_trigger()
1461 int ret = tracing_arm_snapshot(file->tr); in register_snapshot_trigger()
1468 tracing_disarm_snapshot(file->tr); in register_snapshot_trigger()
1477 tracing_disarm_snapshot(file->tr); in unregister_snapshot_trigger()
1483 return event_trigger_print("snapshot", m, (void *)data->count, in snapshot_trigger_print()
1484 data->filter_str); in snapshot_trigger_print()
1502 snapshot_get_trigger_ops(char *cmd, char *param) in snapshot_get_trigger_ops() argument
1508 .name = "snapshot",
1553 struct trace_event_file *file = data->private_data; in stacktrace_trigger()
1556 __trace_stack(file->tr, tracing_gen_ctx_dec(), STACK_SKIP); in stacktrace_trigger()
1566 if (!data->count) in stacktrace_count_trigger()
1569 if (data->count != -1) in stacktrace_count_trigger()
1570 (data->count)--; in stacktrace_count_trigger()
1578 return event_trigger_print("stacktrace", m, (void *)data->count, in stacktrace_trigger_print()
1579 data->filter_str); in stacktrace_trigger_print()
1597 stacktrace_get_trigger_ops(char *cmd, char *param) in stacktrace_get_trigger_ops() argument
1603 .name = "stacktrace",
1637 struct enable_trigger_data *enable_data = data->private_data; in event_enable_trigger()
1639 if (enable_data->enable) in event_enable_trigger()
1640 clear_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &enable_data->file->flags); in event_enable_trigger()
1642 set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &enable_data->file->flags); in event_enable_trigger()
1650 struct enable_trigger_data *enable_data = data->private_data; in event_enable_count_trigger()
1652 if (!data->count) in event_enable_count_trigger()
1656 if (enable_data->enable == !(enable_data->file->flags & EVENT_FILE_FL_SOFT_DISABLED)) in event_enable_count_trigger()
1659 if (data->count != -1) in event_enable_count_trigger()
1660 (data->count)--; in event_enable_count_trigger()
1668 struct enable_trigger_data *enable_data = data->private_data; in event_enable_trigger_print()
1671 enable_data->hist ? in event_enable_trigger_print()
1672 (enable_data->enable ? ENABLE_HIST_STR : DISABLE_HIST_STR) : in event_enable_trigger_print()
1673 (enable_data->enable ? ENABLE_EVENT_STR : DISABLE_EVENT_STR), in event_enable_trigger_print()
1674 enable_data->file->event_call->class->system, in event_enable_trigger_print()
1675 trace_event_name(enable_data->file->event_call)); in event_enable_trigger_print()
1677 if (data->count == -1) in event_enable_trigger_print()
1680 seq_printf(m, ":count=%ld", data->count); in event_enable_trigger_print()
1682 if (data->filter_str) in event_enable_trigger_print()
1683 seq_printf(m, " if %s\n", data->filter_str); in event_enable_trigger_print()
1692 struct enable_trigger_data *enable_data = data->private_data; in event_enable_trigger_free()
1694 if (WARN_ON_ONCE(data->ref <= 0)) in event_enable_trigger_free()
1697 data->ref--; in event_enable_trigger_free()
1698 if (!data->ref) { in event_enable_trigger_free()
1700 trace_event_enable_disable(enable_data->file, 0, 1); in event_enable_trigger_free()
1701 trace_event_put_ref(enable_data->file->event_call); in event_enable_trigger_free()
1737 char *glob, char *cmd, char *param_and_filter) in event_enable_trigger_parse() argument
1742 struct trace_array *tr = file->tr; in event_enable_trigger_parse()
1753 return -EINVAL; in event_enable_trigger_parse()
1761 return -EINVAL; in event_enable_trigger_parse()
1765 ret = -EINVAL; in event_enable_trigger_parse()
1771 hist = ((strcmp(cmd, ENABLE_HIST_STR) == 0) || in event_enable_trigger_parse()
1772 (strcmp(cmd, DISABLE_HIST_STR) == 0)); in event_enable_trigger_parse()
1774 enable = ((strcmp(cmd, ENABLE_EVENT_STR) == 0) || in event_enable_trigger_parse()
1775 (strcmp(cmd, ENABLE_HIST_STR) == 0)); in event_enable_trigger_parse()
1777 enable = strcmp(cmd, ENABLE_EVENT_STR) == 0; in event_enable_trigger_parse()
1779 ret = -ENOMEM; in event_enable_trigger_parse()
1785 enable_data->hist = hist; in event_enable_trigger_parse()
1786 enable_data->enable = enable; in event_enable_trigger_parse()
1787 enable_data->file = event_enable_file; in event_enable_trigger_parse()
1789 trigger_data = trigger_data_alloc(cmd_ops, cmd, param, enable_data); in event_enable_trigger_parse()
1815 ret = trace_event_try_get_ref(event_enable_file->event_call); in event_enable_trigger_parse()
1817 ret = -EBUSY; in event_enable_trigger_parse()
1834 trace_event_put_ref(event_enable_file->event_call); in event_enable_trigger_parse()
1847 struct enable_trigger_data *enable_data = data->private_data; in event_enable_register_trigger()
1854 list_for_each_entry(test, &file->triggers, list) { in event_enable_register_trigger()
1855 test_enable_data = test->private_data; in event_enable_register_trigger()
1857 (test->cmd_ops->trigger_type == in event_enable_register_trigger()
1858 data->cmd_ops->trigger_type) && in event_enable_register_trigger()
1859 (test_enable_data->file == enable_data->file)) { in event_enable_register_trigger()
1860 return -EEXIST; in event_enable_register_trigger()
1864 if (data->ops->init) { in event_enable_register_trigger()
1865 ret = data->ops->init(data); in event_enable_register_trigger()
1870 list_add_rcu(&data->list, &file->triggers); in event_enable_register_trigger()
1875 list_del_rcu(&data->list); in event_enable_register_trigger()
1885 struct enable_trigger_data *test_enable_data = test->private_data; in event_enable_unregister_trigger()
1891 list_for_each_entry(iter, &file->triggers, list) { in event_enable_unregister_trigger()
1892 enable_data = iter->private_data; in event_enable_unregister_trigger()
1894 (iter->cmd_ops->trigger_type == in event_enable_unregister_trigger()
1895 test->cmd_ops->trigger_type) && in event_enable_unregister_trigger()
1896 (enable_data->file == test_enable_data->file)) { in event_enable_unregister_trigger()
1898 list_del_rcu(&data->list); in event_enable_unregister_trigger()
1905 if (data && data->ops->free) in event_enable_unregister_trigger()
1906 data->ops->free(data); in event_enable_unregister_trigger()
1910 event_enable_get_trigger_ops(char *cmd, char *param) in event_enable_get_trigger_ops() argument
1916 enable = ((strcmp(cmd, ENABLE_EVENT_STR) == 0) || in event_enable_get_trigger_ops()
1917 (strcmp(cmd, ENABLE_HIST_STR) == 0)); in event_enable_get_trigger_ops()
1919 enable = strcmp(cmd, ENABLE_EVENT_STR) == 0; in event_enable_get_trigger_ops()
1932 .name = ENABLE_EVENT_STR,
1942 .name = DISABLE_EVENT_STR,