Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * trace_events_trigger - trace event triggers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * Copyright (C) 2013 Tom Zanussi <tom.zanussi@linux.intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) #include <linux/security.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) #include <linux/ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <linux/rculist.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #include "trace.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) static LIST_HEAD(trigger_commands);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) static DEFINE_MUTEX(trigger_cmd_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) void trigger_data_free(struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) 	if (data->cmd_ops->set_filter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) 		data->cmd_ops->set_filter(NULL, data, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) 	/* make sure current triggers exit before free */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) 	tracepoint_synchronize_unregister();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) 	kfree(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32)  * event_triggers_call - Call triggers associated with a trace event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33)  * @file: The trace_event_file associated with the event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34)  * @rec: The trace entry for the event, NULL for unconditional invocation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36)  * For each trigger associated with an event, invoke the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37)  * function registered with the associated trigger command.  If rec is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38)  * non-NULL, it means that the trigger requires further processing and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39)  * shouldn't be unconditionally invoked.  If rec is non-NULL and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40)  * trigger has a filter associated with it, rec will checked against
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41)  * the filter and if the record matches the trigger will be invoked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42)  * If the trigger is a 'post_trigger', meaning it shouldn't be invoked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43)  * in any case until the current event is written, the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44)  * function isn't invoked but the bit associated with the deferred
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45)  * trigger is set in the return value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47)  * Returns an enum event_trigger_type value containing a set bit for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48)  * any trigger that should be deferred, ETT_NONE if nothing to defer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50)  * Called from tracepoint handlers (with rcu_read_lock_sched() held).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52)  * Return: an enum event_trigger_type value containing a set bit for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53)  * any trigger that should be deferred, ETT_NONE if nothing to defer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) enum event_trigger_type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) event_triggers_call(struct trace_event_file *file, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 		    struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	struct event_trigger_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 	enum event_trigger_type tt = ETT_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	struct event_filter *filter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 	if (list_empty(&file->triggers))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 		return tt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 	list_for_each_entry_rcu(data, &file->triggers, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 		if (data->paused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 		if (!rec) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 			data->ops->func(data, rec, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 		filter = rcu_dereference_sched(data->filter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 		if (filter && !filter_match_preds(filter, rec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) 		if (event_command_post_trigger(data->cmd_ops)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 			tt |= data->cmd_ops->trigger_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 		data->ops->func(data, rec, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 	return tt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) EXPORT_SYMBOL_GPL(event_triggers_call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87)  * event_triggers_post_call - Call 'post_triggers' for a trace event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88)  * @file: The trace_event_file associated with the event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89)  * @tt: enum event_trigger_type containing a set bit for each trigger to invoke
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91)  * For each trigger associated with an event, invoke the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92)  * function registered with the associated trigger command, if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93)  * corresponding bit is set in the tt enum passed into this function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94)  * See @event_triggers_call for details on how those bits are set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96)  * Called from tracepoint handlers (with rcu_read_lock_sched() held).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) event_triggers_post_call(struct trace_event_file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 			 enum event_trigger_type tt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 	struct event_trigger_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 	list_for_each_entry_rcu(data, &file->triggers, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 		if (data->paused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 		if (data->cmd_ops->trigger_type & tt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 			data->ops->func(data, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) EXPORT_SYMBOL_GPL(event_triggers_post_call);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) #define SHOW_AVAILABLE_TRIGGERS	(void *)(1UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) static void *trigger_next(struct seq_file *m, void *t, loff_t *pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	struct trace_event_file *event_file = event_file_data(m->private);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 	if (t == SHOW_AVAILABLE_TRIGGERS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 		(*pos)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 	return seq_list_next(t, &event_file->triggers, pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) static void *trigger_start(struct seq_file *m, loff_t *pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	struct trace_event_file *event_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 	/* ->stop() is called even if ->start() fails */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 	mutex_lock(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 	event_file = event_file_data(m->private);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 	if (unlikely(!event_file))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 		return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 	if (list_empty(&event_file->triggers))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 		return *pos == 0 ? SHOW_AVAILABLE_TRIGGERS : NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 	return seq_list_start(&event_file->triggers, *pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) static void trigger_stop(struct seq_file *m, void *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 	mutex_unlock(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) static int trigger_show(struct seq_file *m, void *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 	struct event_trigger_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 	struct event_command *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 	if (v == SHOW_AVAILABLE_TRIGGERS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 		seq_puts(m, "# Available triggers:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 		seq_putc(m, '#');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 		mutex_lock(&trigger_cmd_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 		list_for_each_entry_reverse(p, &trigger_commands, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 			seq_printf(m, " %s", p->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 		seq_putc(m, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 		mutex_unlock(&trigger_cmd_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 	data = list_entry(v, struct event_trigger_data, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 	data->ops->print(m, data->ops, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) static const struct seq_operations event_triggers_seq_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 	.start = trigger_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	.next = trigger_next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 	.stop = trigger_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 	.show = trigger_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) static int event_trigger_regex_open(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 	ret = security_locked_down(LOCKDOWN_TRACEFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	mutex_lock(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	if (unlikely(!event_file_data(file))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 		mutex_unlock(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 	if ((file->f_mode & FMODE_WRITE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 	    (file->f_flags & O_TRUNC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 		struct trace_event_file *event_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 		struct event_command *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 		event_file = event_file_data(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 		list_for_each_entry(p, &trigger_commands, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 			if (p->unreg_all)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 				p->unreg_all(event_file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 	if (file->f_mode & FMODE_READ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 		ret = seq_open(file, &event_triggers_seq_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 		if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 			struct seq_file *m = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 			m->private = file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 	mutex_unlock(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) int trigger_process_regex(struct trace_event_file *file, char *buff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 	char *command, *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 	struct event_command *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	int ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	next = buff = skip_spaces(buff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 	command = strsep(&next, ": \t");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 	if (next) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 		next = skip_spaces(next);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 		if (!*next)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 			next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	command = (command[0] != '!') ? command : command + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 	mutex_lock(&trigger_cmd_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 	list_for_each_entry(p, &trigger_commands, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 		if (strcmp(p->name, command) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 			ret = p->func(p, file, buff, command, next);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 			goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239)  out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 	mutex_unlock(&trigger_cmd_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) static ssize_t event_trigger_regex_write(struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 					 const char __user *ubuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 					 size_t cnt, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 	struct trace_event_file *event_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 	ssize_t ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 	char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 	if (!cnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 	if (cnt >= PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 	buf = memdup_user_nul(ubuf, cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 	if (IS_ERR(buf))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 		return PTR_ERR(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 	strim(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	mutex_lock(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	event_file = event_file_data(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 	if (unlikely(!event_file)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 		mutex_unlock(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 		kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 	ret = trigger_process_regex(event_file, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	mutex_unlock(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 	kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 	*ppos += cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	ret = cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281)  out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) static int event_trigger_regex_release(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	mutex_lock(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 	if (file->f_mode & FMODE_READ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 		seq_release(inode, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	mutex_unlock(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) event_trigger_write(struct file *filp, const char __user *ubuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 		    size_t cnt, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 	return event_trigger_regex_write(filp, ubuf, cnt, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) event_trigger_open(struct inode *inode, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 	/* Checks for tracefs lockdown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 	return event_trigger_regex_open(inode, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) event_trigger_release(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	return event_trigger_regex_release(inode, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) const struct file_operations event_trigger_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	.open = event_trigger_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	.read = seq_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	.write = event_trigger_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 	.llseek = tracing_lseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	.release = event_trigger_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326)  * Currently we only register event commands from __init, so mark this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327)  * __init too.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) __init int register_event_command(struct event_command *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 	struct event_command *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 	mutex_lock(&trigger_cmd_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	list_for_each_entry(p, &trigger_commands, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 		if (strcmp(cmd->name, p->name) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 			ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 			goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 	list_add(&cmd->list, &trigger_commands);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342)  out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 	mutex_unlock(&trigger_cmd_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349)  * Currently we only unregister event commands from __init, so mark
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350)  * this __init too.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) __init int unregister_event_command(struct event_command *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	struct event_command *p, *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	int ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 	mutex_lock(&trigger_cmd_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	list_for_each_entry_safe(p, n, &trigger_commands, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 		if (strcmp(cmd->name, p->name) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 			list_del_init(&p->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 			goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365)  out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 	mutex_unlock(&trigger_cmd_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372)  * event_trigger_print - Generic event_trigger_ops @print implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373)  * @name: The name of the event trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374)  * @m: The seq_file being printed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375)  * @data: Trigger-specific data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376)  * @filter_str: filter_str to print, if present
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378)  * Common implementation for event triggers to print themselves.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380)  * Usually wrapped by a function that simply sets the @name of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381)  * trigger command and then invokes this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383)  * Return: 0 on success, errno otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) event_trigger_print(const char *name, struct seq_file *m,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 		    void *data, char *filter_str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 	long count = (long)data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 	seq_puts(m, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	if (count == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 		seq_puts(m, ":unlimited");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 		seq_printf(m, ":count=%ld", count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	if (filter_str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 		seq_printf(m, " if %s\n", filter_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 		seq_putc(m, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407)  * event_trigger_init - Generic event_trigger_ops @init implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408)  * @ops: The trigger ops associated with the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409)  * @data: Trigger-specific data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411)  * Common implementation of event trigger initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413)  * Usually used directly as the @init method in event trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414)  * implementations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416)  * Return: 0 on success, errno otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) int event_trigger_init(struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 		       struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 	data->ref++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426)  * event_trigger_free - Generic event_trigger_ops @free implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427)  * @ops: The trigger ops associated with the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428)  * @data: Trigger-specific data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430)  * Common implementation of event trigger de-initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432)  * Usually used directly as the @free method in event trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433)  * implementations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) event_trigger_free(struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 		   struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	if (WARN_ON_ONCE(data->ref <= 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 	data->ref--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 	if (!data->ref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 		trigger_data_free(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) int trace_event_trigger_enable_disable(struct trace_event_file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 				       int trigger_enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 	if (trigger_enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 		if (atomic_inc_return(&file->tm_ref) > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 		set_bit(EVENT_FILE_FL_TRIGGER_MODE_BIT, &file->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 		ret = trace_event_enable_disable(file, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 		if (atomic_dec_return(&file->tm_ref) > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 		clear_bit(EVENT_FILE_FL_TRIGGER_MODE_BIT, &file->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 		ret = trace_event_enable_disable(file, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468)  * clear_event_triggers - Clear all triggers associated with a trace array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469)  * @tr: The trace array to clear
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471)  * For each trigger, the triggering event has its tm_ref decremented
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472)  * via trace_event_trigger_enable_disable(), and any associated event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473)  * (in the case of enable/disable_event triggers) will have its sm_ref
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474)  * decremented via free()->trace_event_enable_disable().  That
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475)  * combination effectively reverses the soft-mode/trigger state added
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476)  * by trigger registration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478)  * Must be called with event_mutex held.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) clear_event_triggers(struct trace_array *tr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	struct trace_event_file *file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	list_for_each_entry(file, &tr->events, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 		struct event_trigger_data *data, *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 		list_for_each_entry_safe(data, n, &file->triggers, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 			trace_event_trigger_enable_disable(file, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 			list_del_rcu(&data->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 			if (data->ops->free)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 				data->ops->free(data->ops, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497)  * update_cond_flag - Set or reset the TRIGGER_COND bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498)  * @file: The trace_event_file associated with the event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500)  * If an event has triggers and any of those triggers has a filter or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501)  * a post_trigger, trigger invocation needs to be deferred until after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502)  * the current event has logged its data, and the event should have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503)  * its TRIGGER_COND bit set, otherwise the TRIGGER_COND bit should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504)  * cleared.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) void update_cond_flag(struct trace_event_file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 	struct event_trigger_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	bool set_cond = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 	lockdep_assert_held(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 	list_for_each_entry(data, &file->triggers, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 		if (data->filter || event_command_post_trigger(data->cmd_ops) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 		    event_command_needs_rec(data->cmd_ops)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 			set_cond = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 	if (set_cond)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 		set_bit(EVENT_FILE_FL_TRIGGER_COND_BIT, &file->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 		clear_bit(EVENT_FILE_FL_TRIGGER_COND_BIT, &file->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528)  * register_trigger - Generic event_command @reg implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529)  * @glob: The raw string used to register the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530)  * @ops: The trigger ops associated with the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531)  * @data: Trigger-specific data to associate with the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532)  * @file: The trace_event_file associated with the event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534)  * Common implementation for event trigger registration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536)  * Usually used directly as the @reg method in event command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537)  * implementations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539)  * Return: 0 on success, errno otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) static int register_trigger(char *glob, struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 			    struct event_trigger_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 			    struct trace_event_file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 	struct event_trigger_data *test;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 	lockdep_assert_held(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 	list_for_each_entry(test, &file->triggers, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 		if (test->cmd_ops->trigger_type == data->cmd_ops->trigger_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 			ret = -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 	if (data->ops->init) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 		ret = data->ops->init(data->ops, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 		if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	list_add_rcu(&data->list, &file->triggers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 	ret++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 	update_cond_flag(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 	if (trace_event_trigger_enable_disable(file, 1) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 		list_del_rcu(&data->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 		update_cond_flag(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 		ret--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577)  * unregister_trigger - Generic event_command @unreg implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578)  * @glob: The raw string used to register the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579)  * @ops: The trigger ops associated with the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580)  * @test: Trigger-specific data used to find the trigger to remove
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581)  * @file: The trace_event_file associated with the event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583)  * Common implementation for event trigger unregistration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585)  * Usually used directly as the @unreg method in event command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586)  * implementations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) static void unregister_trigger(char *glob, struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 			       struct event_trigger_data *test,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 			       struct trace_event_file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 	struct event_trigger_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 	bool unregistered = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 	lockdep_assert_held(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 	list_for_each_entry(data, &file->triggers, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 		if (data->cmd_ops->trigger_type == test->cmd_ops->trigger_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 			unregistered = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 			list_del_rcu(&data->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 			trace_event_trigger_enable_disable(file, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 			update_cond_flag(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	if (unregistered && data->ops->free)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 		data->ops->free(data->ops, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612)  * event_trigger_callback - Generic event_command @func implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613)  * @cmd_ops: The command ops, used for trigger registration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614)  * @file: The trace_event_file associated with the event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615)  * @glob: The raw string used to register the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616)  * @cmd: The cmd portion of the string used to register the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617)  * @param: The params portion of the string used to register the trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619)  * Common implementation for event command parsing and trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620)  * instantiation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622)  * Usually used directly as the @func method in event command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623)  * implementations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625)  * Return: 0 on success, errno otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) event_trigger_callback(struct event_command *cmd_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 		       struct trace_event_file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 		       char *glob, char *cmd, char *param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 	struct event_trigger_data *trigger_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 	struct event_trigger_ops *trigger_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 	char *trigger = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	char *number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	/* separate the trigger from the filter (t:n [if filter]) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	if (param && isdigit(param[0])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 		trigger = strsep(&param, " \t");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 		if (param) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 			param = skip_spaces(param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 			if (!*param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 				param = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	if (!trigger_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 	trigger_data->count = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 	trigger_data->ops = trigger_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 	trigger_data->cmd_ops = cmd_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 	trigger_data->private_data = file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 	INIT_LIST_HEAD(&trigger_data->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 	INIT_LIST_HEAD(&trigger_data->named_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 	if (glob[0] == '!') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 		cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 		kfree(trigger_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 	if (trigger) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 		number = strsep(&trigger, ":");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 		ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 		if (!strlen(number))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 			goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 		 * We use the callback data field (which is a pointer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 		 * as our counter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 		ret = kstrtoul(number, 0, &trigger_data->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 			goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 	if (!param) /* if param is non-empty, it's supposed to be a filter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 		goto out_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	if (!cmd_ops->set_filter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 		goto out_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 	ret = cmd_ops->set_filter(param, trigger_data, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 		goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695)  out_reg:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	/* Up the trigger_data count to make sure reg doesn't free it on failure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	event_trigger_init(trigger_ops, trigger_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 	 * The above returns on success the # of functions enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 	 * but if it didn't find any functions it returns zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 	 * Consider no functions a failure too.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 	if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 		cmd_ops->unreg(glob, trigger_ops, trigger_data, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 		ret = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	} else if (ret > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 	/* Down the counter of trigger_data or free it if not used anymore */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 	event_trigger_free(trigger_ops, trigger_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712)  out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715)  out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 	if (cmd_ops->set_filter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 		cmd_ops->set_filter(NULL, trigger_data, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 	kfree(trigger_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723)  * set_trigger_filter - Generic event_command @set_filter implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724)  * @filter_str: The filter string for the trigger, NULL to remove filter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725)  * @trigger_data: Trigger-specific data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726)  * @file: The trace_event_file associated with the event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728)  * Common implementation for event command filter parsing and filter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729)  * instantiation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731)  * Usually used directly as the @set_filter method in event command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732)  * implementations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734)  * Also used to remove a filter (if filter_str = NULL).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736)  * Return: 0 on success, errno otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) int set_trigger_filter(char *filter_str,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 		       struct event_trigger_data *trigger_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 		       struct trace_event_file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	struct event_trigger_data *data = trigger_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 	struct event_filter *filter = NULL, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 	int ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 	char *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 	if (!filter_str) /* clear the current filter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 		goto assign;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 	s = strsep(&filter_str, " \t");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 	if (!strlen(s) || strcmp(s, "if") != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	if (!filter_str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 	/* The filter is for the 'trigger' event, not the triggered event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 	ret = create_event_filter(file->tr, file->event_call,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 				  filter_str, false, &filter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	 * If create_event_filter() fails, filter still needs to be freed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 	 * Which the calling code will do with data->filter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765)  assign:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 	tmp = rcu_access_pointer(data->filter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 	rcu_assign_pointer(data->filter, filter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	if (tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 		/* Make sure the call is done with the filter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 		tracepoint_synchronize_unregister();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 		free_event_filter(tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 	kfree(data->filter_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 	data->filter_str = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 	if (filter_str) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 		data->filter_str = kstrdup(filter_str, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 		if (!data->filter_str) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 			free_event_filter(rcu_access_pointer(data->filter));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 			data->filter = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 			ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787)  out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) static LIST_HEAD(named_triggers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794)  * find_named_trigger - Find the common named trigger associated with @name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795)  * @name: The name of the set of named triggers to find the common data for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797)  * Named triggers are sets of triggers that share a common set of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798)  * trigger data.  The first named trigger registered with a given name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799)  * owns the common trigger data that the others subsequently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800)  * registered with the same name will reference.  This function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801)  * returns the common trigger data associated with that first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802)  * registered instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804)  * Return: the common trigger data for the given named trigger on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805)  * success, NULL otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) struct event_trigger_data *find_named_trigger(const char *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 	struct event_trigger_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 	if (!name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 	list_for_each_entry(data, &named_triggers, named_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 		if (data->named_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 		if (strcmp(data->name, name) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 			return data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825)  * is_named_trigger - determine if a given trigger is a named trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826)  * @test: The trigger data to test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828)  * Return: true if 'test' is a named trigger, false otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) bool is_named_trigger(struct event_trigger_data *test)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 	struct event_trigger_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 	list_for_each_entry(data, &named_triggers, named_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 		if (test == data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843)  * save_named_trigger - save the trigger in the named trigger list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844)  * @name: The name of the named trigger set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845)  * @data: The trigger data to save
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847)  * Return: 0 if successful, negative error otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) int save_named_trigger(const char *name, struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 	data->name = kstrdup(name, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	if (!data->name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 	list_add(&data->named_list, &named_triggers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861)  * del_named_trigger - delete a trigger from the named trigger list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862)  * @data: The trigger data to delete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) void del_named_trigger(struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 	kfree(data->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 	data->name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 	list_del(&data->named_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) static void __pause_named_trigger(struct event_trigger_data *data, bool pause)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 	struct event_trigger_data *test;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 	list_for_each_entry(test, &named_triggers, named_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 		if (strcmp(test->name, data->name) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 			if (pause) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 				test->paused_tmp = test->paused;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 				test->paused = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 				test->paused = test->paused_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889)  * pause_named_trigger - Pause all named triggers with the same name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890)  * @data: The trigger data of a named trigger to pause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892)  * Pauses a named trigger along with all other triggers having the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893)  * same name.  Because named triggers share a common set of data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894)  * pausing only one is meaningless, so pausing one named trigger needs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895)  * to pause all triggers with the same name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) void pause_named_trigger(struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 	__pause_named_trigger(data, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903)  * unpause_named_trigger - Un-pause all named triggers with the same name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904)  * @data: The trigger data of a named trigger to unpause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906)  * Un-pauses a named trigger along with all other triggers having the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907)  * same name.  Because named triggers share a common set of data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908)  * unpausing only one is meaningless, so unpausing one named trigger
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909)  * needs to unpause all triggers with the same name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) void unpause_named_trigger(struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 	__pause_named_trigger(data, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917)  * set_named_trigger_data - Associate common named trigger data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918)  * @data: The trigger data of a named trigger to unpause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920)  * Named triggers are sets of triggers that share a common set of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921)  * trigger data.  The first named trigger registered with a given name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922)  * owns the common trigger data that the others subsequently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923)  * registered with the same name will reference.  This function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924)  * associates the common trigger data from the first trigger with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925)  * given trigger.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) void set_named_trigger_data(struct event_trigger_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 			    struct event_trigger_data *named_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	data->named_data = named_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) struct event_trigger_data *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) get_named_trigger_data(struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 	return data->named_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) traceon_trigger(struct event_trigger_data *data, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 		struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 	struct trace_event_file *file = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 	if (file) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 		if (tracer_tracing_is_on(file->tr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 		tracer_tracing_on(file->tr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 	if (tracing_is_on())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 	tracing_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) traceon_count_trigger(struct event_trigger_data *data, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 		      struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	struct trace_event_file *file = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 	if (file) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 		if (tracer_tracing_is_on(file->tr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 		if (tracing_is_on())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 	if (!data->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	if (data->count != -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 		(data->count)--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	if (file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 		tracer_tracing_on(file->tr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 		tracing_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) traceoff_trigger(struct event_trigger_data *data, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 		 struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 	struct trace_event_file *file = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 	if (file) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 		if (!tracer_tracing_is_on(file->tr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 		tracer_tracing_off(file->tr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 	if (!tracing_is_on())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 	tracing_off();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) traceoff_count_trigger(struct event_trigger_data *data, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 		       struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 	struct trace_event_file *file = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 	if (file) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 		if (!tracer_tracing_is_on(file->tr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 		if (!tracing_is_on())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 	if (!data->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 	if (data->count != -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 		(data->count)--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 	if (file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 		tracer_tracing_off(file->tr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 		tracing_off();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) traceon_trigger_print(struct seq_file *m, struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 		      struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	return event_trigger_print("traceon", m, (void *)data->count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 				   data->filter_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) traceoff_trigger_print(struct seq_file *m, struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 		       struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	return event_trigger_print("traceoff", m, (void *)data->count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 				   data->filter_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) static struct event_trigger_ops traceon_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	.func			= traceon_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 	.print			= traceon_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 	.free			= event_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) static struct event_trigger_ops traceon_count_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	.func			= traceon_count_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 	.print			= traceon_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 	.free			= event_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) static struct event_trigger_ops traceoff_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 	.func			= traceoff_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 	.print			= traceoff_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 	.free			= event_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) static struct event_trigger_ops traceoff_count_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 	.func			= traceoff_count_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 	.print			= traceoff_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 	.free			= event_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) static struct event_trigger_ops *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) onoff_get_trigger_ops(char *cmd, char *param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 	struct event_trigger_ops *ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 	/* we register both traceon and traceoff to this callback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 	if (strcmp(cmd, "traceon") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 		ops = param ? &traceon_count_trigger_ops :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 			&traceon_trigger_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 		ops = param ? &traceoff_count_trigger_ops :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 			&traceoff_trigger_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 	return ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) static struct event_command trigger_traceon_cmd = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 	.name			= "traceon",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 	.trigger_type		= ETT_TRACE_ONOFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	.func			= event_trigger_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 	.reg			= register_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	.unreg			= unregister_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 	.get_trigger_ops	= onoff_get_trigger_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 	.set_filter		= set_trigger_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) static struct event_command trigger_traceoff_cmd = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 	.name			= "traceoff",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	.trigger_type		= ETT_TRACE_ONOFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 	.flags			= EVENT_CMD_FL_POST_TRIGGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 	.func			= event_trigger_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 	.reg			= register_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 	.unreg			= unregister_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 	.get_trigger_ops	= onoff_get_trigger_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	.set_filter		= set_trigger_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) #ifdef CONFIG_TRACER_SNAPSHOT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) snapshot_trigger(struct event_trigger_data *data, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 		 struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 	struct trace_event_file *file = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 	if (file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 		tracing_snapshot_instance(file->tr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 		tracing_snapshot();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) snapshot_count_trigger(struct event_trigger_data *data, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 		       struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 	if (!data->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	if (data->count != -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 		(data->count)--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	snapshot_trigger(data, rec, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) register_snapshot_trigger(char *glob, struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 			  struct event_trigger_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 			  struct trace_event_file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 	if (tracing_alloc_snapshot_instance(file->tr) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	return register_trigger(glob, ops, data, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) snapshot_trigger_print(struct seq_file *m, struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 		       struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 	return event_trigger_print("snapshot", m, (void *)data->count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 				   data->filter_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) static struct event_trigger_ops snapshot_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 	.func			= snapshot_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	.print			= snapshot_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 	.free			= event_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) static struct event_trigger_ops snapshot_count_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	.func			= snapshot_count_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	.print			= snapshot_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 	.free			= event_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) static struct event_trigger_ops *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) snapshot_get_trigger_ops(char *cmd, char *param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 	return param ? &snapshot_count_trigger_ops : &snapshot_trigger_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) static struct event_command trigger_snapshot_cmd = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 	.name			= "snapshot",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 	.trigger_type		= ETT_SNAPSHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 	.func			= event_trigger_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 	.reg			= register_snapshot_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 	.unreg			= unregister_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 	.get_trigger_ops	= snapshot_get_trigger_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 	.set_filter		= set_trigger_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) static __init int register_trigger_snapshot_cmd(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 	ret = register_event_command(&trigger_snapshot_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 	WARN_ON(ret < 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) static __init int register_trigger_snapshot_cmd(void) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) #endif /* CONFIG_TRACER_SNAPSHOT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) #ifdef CONFIG_STACKTRACE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) #ifdef CONFIG_UNWINDER_ORC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) /* Skip 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203)  *   event_triggers_post_call()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204)  *   trace_event_raw_event_xxx()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) # define STACK_SKIP 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209)  * Skip 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210)  *   stacktrace_trigger()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)  *   event_triggers_post_call()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)  *   trace_event_buffer_commit()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213)  *   trace_event_raw_event_xxx()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) #define STACK_SKIP 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) stacktrace_trigger(struct event_trigger_data *data, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 		   struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 	trace_dump_stack(STACK_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) stacktrace_count_trigger(struct event_trigger_data *data, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 			 struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 	if (!data->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 	if (data->count != -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 		(data->count)--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 	stacktrace_trigger(data, rec, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) stacktrace_trigger_print(struct seq_file *m, struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 			 struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 	return event_trigger_print("stacktrace", m, (void *)data->count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 				   data->filter_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) static struct event_trigger_ops stacktrace_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 	.func			= stacktrace_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 	.print			= stacktrace_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 	.free			= event_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) static struct event_trigger_ops stacktrace_count_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	.func			= stacktrace_count_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 	.print			= stacktrace_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 	.free			= event_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) static struct event_trigger_ops *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) stacktrace_get_trigger_ops(char *cmd, char *param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 	return param ? &stacktrace_count_trigger_ops : &stacktrace_trigger_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) static struct event_command trigger_stacktrace_cmd = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 	.name			= "stacktrace",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 	.trigger_type		= ETT_STACKTRACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 	.flags			= EVENT_CMD_FL_POST_TRIGGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 	.func			= event_trigger_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 	.reg			= register_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 	.unreg			= unregister_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 	.get_trigger_ops	= stacktrace_get_trigger_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 	.set_filter		= set_trigger_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) static __init int register_trigger_stacktrace_cmd(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 	ret = register_event_command(&trigger_stacktrace_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 	WARN_ON(ret < 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) static __init int register_trigger_stacktrace_cmd(void) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) #endif /* CONFIG_STACKTRACE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) static __init void unregister_trigger_traceon_traceoff_cmds(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 	unregister_event_command(&trigger_traceon_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 	unregister_event_command(&trigger_traceoff_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) event_enable_trigger(struct event_trigger_data *data, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 		     struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 	struct enable_trigger_data *enable_data = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 	if (enable_data->enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 		clear_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &enable_data->file->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 		set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &enable_data->file->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) event_enable_count_trigger(struct event_trigger_data *data, void *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 			   struct ring_buffer_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 	struct enable_trigger_data *enable_data = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 	if (!data->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 	/* Skip if the event is in a state we want to switch to */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 	if (enable_data->enable == !(enable_data->file->flags & EVENT_FILE_FL_SOFT_DISABLED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 	if (data->count != -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 		(data->count)--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	event_enable_trigger(data, rec, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) int event_enable_trigger_print(struct seq_file *m,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 			       struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 			       struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 	struct enable_trigger_data *enable_data = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 	seq_printf(m, "%s:%s:%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 		   enable_data->hist ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 		   (enable_data->enable ? ENABLE_HIST_STR : DISABLE_HIST_STR) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 		   (enable_data->enable ? ENABLE_EVENT_STR : DISABLE_EVENT_STR),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 		   enable_data->file->event_call->class->system,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 		   trace_event_name(enable_data->file->event_call));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 	if (data->count == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 		seq_puts(m, ":unlimited");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 		seq_printf(m, ":count=%ld", data->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 	if (data->filter_str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 		seq_printf(m, " if %s\n", data->filter_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 		seq_putc(m, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) void event_enable_trigger_free(struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 			       struct event_trigger_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 	struct enable_trigger_data *enable_data = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 	if (WARN_ON_ONCE(data->ref <= 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 	data->ref--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 	if (!data->ref) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 		/* Remove the SOFT_MODE flag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 		trace_event_enable_disable(enable_data->file, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 		module_put(enable_data->file->event_call->mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 		trigger_data_free(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 		kfree(enable_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) static struct event_trigger_ops event_enable_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 	.func			= event_enable_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 	.print			= event_enable_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 	.free			= event_enable_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) static struct event_trigger_ops event_enable_count_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 	.func			= event_enable_count_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 	.print			= event_enable_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 	.free			= event_enable_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) static struct event_trigger_ops event_disable_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 	.func			= event_enable_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 	.print			= event_enable_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 	.free			= event_enable_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) static struct event_trigger_ops event_disable_count_trigger_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 	.func			= event_enable_count_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 	.print			= event_enable_trigger_print,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 	.init			= event_trigger_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 	.free			= event_enable_trigger_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) int event_enable_trigger_func(struct event_command *cmd_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 			      struct trace_event_file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 			      char *glob, char *cmd, char *param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 	struct trace_event_file *event_enable_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 	struct enable_trigger_data *enable_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 	struct event_trigger_data *trigger_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 	struct event_trigger_ops *trigger_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 	struct trace_array *tr = file->tr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 	const char *system;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 	const char *event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 	bool hist = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 	char *trigger;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 	char *number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 	bool enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 	if (!param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 	/* separate the trigger from the filter (s:e:n [if filter]) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 	trigger = strsep(&param, " \t");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 	if (!trigger)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 	if (param) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 		param = skip_spaces(param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 		if (!*param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 			param = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 	system = strsep(&trigger, ":");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 	if (!trigger)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 	event = strsep(&trigger, ":");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 	ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 	event_enable_file = find_event_file(tr, system, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 	if (!event_enable_file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) #ifdef CONFIG_HIST_TRIGGERS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 	hist = ((strcmp(cmd, ENABLE_HIST_STR) == 0) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 		(strcmp(cmd, DISABLE_HIST_STR) == 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 	enable = ((strcmp(cmd, ENABLE_EVENT_STR) == 0) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 		  (strcmp(cmd, ENABLE_HIST_STR) == 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 	enable = strcmp(cmd, ENABLE_EVENT_STR) == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 	trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 	ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 	trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 	if (!trigger_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 	enable_data = kzalloc(sizeof(*enable_data), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) 	if (!enable_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 		kfree(trigger_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 	trigger_data->count = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 	trigger_data->ops = trigger_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 	trigger_data->cmd_ops = cmd_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 	INIT_LIST_HEAD(&trigger_data->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 	RCU_INIT_POINTER(trigger_data->filter, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 	enable_data->hist = hist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 	enable_data->enable = enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 	enable_data->file = event_enable_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 	trigger_data->private_data = enable_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 	if (glob[0] == '!') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 		cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 		kfree(trigger_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 		kfree(enable_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 	/* Up the trigger_data count to make sure nothing frees it on failure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 	event_trigger_init(trigger_ops, trigger_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 	if (trigger) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 		number = strsep(&trigger, ":");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 		ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 		if (!strlen(number))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 			goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 		 * We use the callback data field (which is a pointer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 		 * as our counter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 		ret = kstrtoul(number, 0, &trigger_data->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 			goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 	if (!param) /* if param is non-empty, it's supposed to be a filter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 		goto out_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 	if (!cmd_ops->set_filter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 		goto out_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 	ret = cmd_ops->set_filter(param, trigger_data, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 		goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)  out_reg:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 	/* Don't let event modules unload while probe registered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 	ret = try_module_get(event_enable_file->event_call->mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 	if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 		ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 		goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) 	ret = trace_event_enable_disable(event_enable_file, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 		goto out_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) 	ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 	 * The above returns on success the # of functions enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 	 * but if it didn't find any functions it returns zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 	 * Consider no functions a failure too.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 	if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 		ret = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 		goto out_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 	} else if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 		goto out_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 	/* Just return zero, not the number of enabled functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 	ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 	event_trigger_free(trigger_ops, trigger_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535)  out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)  out_disable:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 	trace_event_enable_disable(event_enable_file, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540)  out_put:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 	module_put(event_enable_file->event_call->mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)  out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 	if (cmd_ops->set_filter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 		cmd_ops->set_filter(NULL, trigger_data, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 	event_trigger_free(trigger_ops, trigger_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 	kfree(enable_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 	goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) int event_enable_register_trigger(char *glob,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 				  struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 				  struct event_trigger_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 				  struct trace_event_file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 	struct enable_trigger_data *enable_data = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 	struct enable_trigger_data *test_enable_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) 	struct event_trigger_data *test;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 	lockdep_assert_held(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 	list_for_each_entry(test, &file->triggers, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) 		test_enable_data = test->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 		if (test_enable_data &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 		    (test->cmd_ops->trigger_type ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 		     data->cmd_ops->trigger_type) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) 		    (test_enable_data->file == enable_data->file)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 			ret = -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 	if (data->ops->init) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 		ret = data->ops->init(data->ops, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 		if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 	list_add_rcu(&data->list, &file->triggers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) 	ret++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 	update_cond_flag(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 	if (trace_event_trigger_enable_disable(file, 1) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 		list_del_rcu(&data->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 		update_cond_flag(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) 		ret--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) void event_enable_unregister_trigger(char *glob,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 				     struct event_trigger_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 				     struct event_trigger_data *test,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 				     struct trace_event_file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 	struct enable_trigger_data *test_enable_data = test->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 	struct enable_trigger_data *enable_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 	struct event_trigger_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 	bool unregistered = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 	lockdep_assert_held(&event_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 	list_for_each_entry(data, &file->triggers, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 		enable_data = data->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 		if (enable_data &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 		    (data->cmd_ops->trigger_type ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 		     test->cmd_ops->trigger_type) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 		    (enable_data->file == test_enable_data->file)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 			unregistered = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 			list_del_rcu(&data->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 			trace_event_trigger_enable_disable(file, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 			update_cond_flag(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) 	if (unregistered && data->ops->free)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 		data->ops->free(data->ops, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) static struct event_trigger_ops *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) event_enable_get_trigger_ops(char *cmd, char *param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) 	struct event_trigger_ops *ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 	bool enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) #ifdef CONFIG_HIST_TRIGGERS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 	enable = ((strcmp(cmd, ENABLE_EVENT_STR) == 0) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 		  (strcmp(cmd, ENABLE_HIST_STR) == 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 	enable = strcmp(cmd, ENABLE_EVENT_STR) == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 	if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) 		ops = param ? &event_enable_count_trigger_ops :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 			&event_enable_trigger_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 		ops = param ? &event_disable_count_trigger_ops :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) 			&event_disable_trigger_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 	return ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) static struct event_command trigger_enable_cmd = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 	.name			= ENABLE_EVENT_STR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) 	.trigger_type		= ETT_EVENT_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 	.func			= event_enable_trigger_func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) 	.reg			= event_enable_register_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) 	.unreg			= event_enable_unregister_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) 	.get_trigger_ops	= event_enable_get_trigger_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) 	.set_filter		= set_trigger_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) static struct event_command trigger_disable_cmd = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) 	.name			= DISABLE_EVENT_STR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) 	.trigger_type		= ETT_EVENT_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) 	.func			= event_enable_trigger_func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) 	.reg			= event_enable_register_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) 	.unreg			= event_enable_unregister_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) 	.get_trigger_ops	= event_enable_get_trigger_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) 	.set_filter		= set_trigger_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) static __init void unregister_trigger_enable_disable_cmds(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) 	unregister_event_command(&trigger_enable_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) 	unregister_event_command(&trigger_disable_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) static __init int register_trigger_enable_disable_cmds(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 	ret = register_event_command(&trigger_enable_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) 	if (WARN_ON(ret < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) 	ret = register_event_command(&trigger_disable_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 	if (WARN_ON(ret < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) 		unregister_trigger_enable_disable_cmds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) static __init int register_trigger_traceon_traceoff_cmds(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) 	ret = register_event_command(&trigger_traceon_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) 	if (WARN_ON(ret < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) 	ret = register_event_command(&trigger_traceoff_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) 	if (WARN_ON(ret < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) 		unregister_trigger_traceon_traceoff_cmds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) __init int register_trigger_cmds(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) 	register_trigger_traceon_traceoff_cmds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) 	register_trigger_snapshot_cmd();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) 	register_trigger_stacktrace_cmd();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) 	register_trigger_enable_disable_cmds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) 	register_trigger_hist_enable_disable_cmds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) 	register_trigger_hist_cmd();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) }