Commit b8cc44a4 authored by Tom Zanussi's avatar Tom Zanussi Committed by Steven Rostedt (Google)

tracing: Remove logic for registering multiple event triggers at a time

Code for registering triggers assumes it's possible to register more
than one trigger at a time.  In fact, it's unimplemented and there
doesn't seem to be a reason to do that.

Remove the n_registered param from event_trigger_register() and fix up
callers.

Doing so simplifies the logic in event_trigger_register to the point
that it just becomes a wrapper calling event_command.reg().

It also removes the problematic call to event_command.unreg() in case
of failure.  A new function, event_trigger_unregister() is also added
for callers to call themselves.

The changes to trace_events_hist.c simply allow compilation; a
separate patch follows which updates the hist triggers to work
correctly with the new changes.

Link: https://lkml.kernel.org/r/6149fec7a139d93e84fa4535672fb5bef88006b0.1644010575.git.zanussi@kernel.orgSigned-off-by: default avatarTom Zanussi <zanussi@kernel.org>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 217d8c05
...@@ -1629,10 +1629,11 @@ extern void event_trigger_reset_filter(struct event_command *cmd_ops, ...@@ -1629,10 +1629,11 @@ extern void event_trigger_reset_filter(struct event_command *cmd_ops,
extern int event_trigger_register(struct event_command *cmd_ops, extern int event_trigger_register(struct event_command *cmd_ops,
struct trace_event_file *file, struct trace_event_file *file,
char *glob, char *glob,
char *cmd, struct event_trigger_data *trigger_data);
char *trigger, extern void event_trigger_unregister(struct event_command *cmd_ops,
struct event_trigger_data *trigger_data, struct trace_event_file *file,
int *n_registered); char *glob,
struct event_trigger_data *trigger_data);
/** /**
* struct event_trigger_ops - callbacks for trace event triggers * struct event_trigger_ops - callbacks for trace event triggers
......
...@@ -6287,7 +6287,7 @@ static int event_hist_trigger_parse(struct event_command *cmd_ops, ...@@ -6287,7 +6287,7 @@ static int event_hist_trigger_parse(struct event_command *cmd_ops,
goto out_free; goto out_free;
} }
cmd_ops->unreg(glob+1, trigger_data, file); event_trigger_unregister(cmd_ops, file, glob+1, trigger_data);
se_name = trace_event_name(file->event_call); se_name = trace_event_name(file->event_call);
se = find_synth_event(se_name); se = find_synth_event(se_name);
if (se) if (se)
...@@ -6296,13 +6296,10 @@ static int event_hist_trigger_parse(struct event_command *cmd_ops, ...@@ -6296,13 +6296,10 @@ static int event_hist_trigger_parse(struct event_command *cmd_ops,
goto out_free; goto out_free;
} }
ret = cmd_ops->reg(glob, trigger_data, file); ret = event_trigger_register(cmd_ops, file, glob, trigger_data);
/* if (ret)
* The above returns on success the # of triggers registered, goto out_free;
* but if it didn't register any it returns zero. Consider no if (ret == 0) {
* triggers registered a failure too.
*/
if (!ret) {
if (!(attrs->pause || attrs->cont || attrs->clear)) if (!(attrs->pause || attrs->cont || attrs->clear))
ret = -ENOENT; ret = -ENOENT;
goto out_free; goto out_free;
...@@ -6331,15 +6328,13 @@ static int event_hist_trigger_parse(struct event_command *cmd_ops, ...@@ -6331,15 +6328,13 @@ static int event_hist_trigger_parse(struct event_command *cmd_ops,
se = find_synth_event(se_name); se = find_synth_event(se_name);
if (se) if (se)
se->ref++; se->ref++;
/* Just return zero, not the number of registered triggers */
ret = 0;
out: out:
if (ret == 0) if (ret == 0)
hist_err_clear(); hist_err_clear();
return ret; return ret;
out_unreg: out_unreg:
cmd_ops->unreg(glob+1, trigger_data, file); event_trigger_unregister(cmd_ops, file, glob+1, trigger_data);
out_free: out_free:
if (cmd_ops->set_filter) if (cmd_ops->set_filter)
cmd_ops->set_filter(NULL, trigger_data, NULL); cmd_ops->set_filter(NULL, trigger_data, NULL);
......
...@@ -587,13 +587,12 @@ static int register_trigger(char *glob, ...@@ -587,13 +587,12 @@ static int register_trigger(char *glob,
} }
list_add_rcu(&data->list, &file->triggers); list_add_rcu(&data->list, &file->triggers);
ret++;
update_cond_flag(file); update_cond_flag(file);
if (trace_event_trigger_enable_disable(file, 1) < 0) { ret = trace_event_trigger_enable_disable(file, 1);
if (ret < 0) {
list_del_rcu(&data->list); list_del_rcu(&data->list);
update_cond_flag(file); update_cond_flag(file);
ret--;
} }
out: out:
return ret; return ret;
...@@ -927,48 +926,37 @@ void event_trigger_reset_filter(struct event_command *cmd_ops, ...@@ -927,48 +926,37 @@ void event_trigger_reset_filter(struct event_command *cmd_ops,
* @cmd_ops: The event_command operations for the trigger * @cmd_ops: The event_command operations for the trigger
* @file: The event file for the trigger's event * @file: The event file for the trigger's event
* @glob: The trigger command string, with optional remove(!) operator * @glob: The trigger command string, with optional remove(!) operator
* @cmd: The cmd string
* @param: The param string
* @trigger_data: The trigger_data for the trigger * @trigger_data: The trigger_data for the trigger
* @n_registered: optional outparam, the number of triggers registered
* *
* Register an event trigger. The @cmd_ops are used to call the * Register an event trigger. The @cmd_ops are used to call the
* cmd_ops->reg() function which actually does the registration. The * cmd_ops->reg() function which actually does the registration.
* cmd_ops->reg() function returns the number of triggers registered,
* which is assigned to n_registered, if n_registered is non-NULL.
* *
* Return: 0 on success, errno otherwise * Return: 0 on success, errno otherwise
*/ */
int event_trigger_register(struct event_command *cmd_ops, int event_trigger_register(struct event_command *cmd_ops,
struct trace_event_file *file, struct trace_event_file *file,
char *glob, char *glob,
char *cmd, struct event_trigger_data *trigger_data)
char *param,
struct event_trigger_data *trigger_data,
int *n_registered)
{ {
int ret; return cmd_ops->reg(glob, trigger_data, file);
}
if (n_registered)
*n_registered = 0;
ret = cmd_ops->reg(glob, trigger_data, file); /**
/* * event_trigger_unregister - unregister an event trigger
* The above returns on success the # of functions enabled, * @cmd_ops: The event_command operations for the trigger
* but if it didn't find any functions it returns zero. * @file: The event file for the trigger's event
* Consider no functions a failure too. * @glob: The trigger command string, with optional remove(!) operator
* @trigger_data: The trigger_data for the trigger
*
* Unregister an event trigger. The @cmd_ops are used to call the
* cmd_ops->unreg() function which actually does the unregistration.
*/ */
if (!ret) { void event_trigger_unregister(struct event_command *cmd_ops,
struct trace_event_file *file,
char *glob,
struct event_trigger_data *trigger_data)
{
cmd_ops->unreg(glob, trigger_data, file); cmd_ops->unreg(glob, trigger_data, file);
ret = -ENOENT;
} else if (ret > 0) {
if (n_registered)
*n_registered = ret;
/* Just return zero, not the number of enabled functions */
ret = 0;
}
return ret;
} }
/* /*
...@@ -1027,7 +1015,7 @@ event_trigger_parse(struct event_command *cmd_ops, ...@@ -1027,7 +1015,7 @@ event_trigger_parse(struct event_command *cmd_ops,
INIT_LIST_HEAD(&trigger_data->named_list); INIT_LIST_HEAD(&trigger_data->named_list);
if (glob[0] == '!') { if (glob[0] == '!') {
cmd_ops->unreg(glob+1, trigger_data, file); event_trigger_unregister(cmd_ops, file, glob+1, trigger_data);
kfree(trigger_data); kfree(trigger_data);
ret = 0; ret = 0;
goto out; goto out;
...@@ -1062,17 +1050,10 @@ event_trigger_parse(struct event_command *cmd_ops, ...@@ -1062,17 +1050,10 @@ event_trigger_parse(struct event_command *cmd_ops,
out_reg: out_reg:
/* Up the trigger_data count to make sure reg doesn't free it on failure */ /* Up the trigger_data count to make sure reg doesn't free it on failure */
event_trigger_init(trigger_ops, trigger_data); event_trigger_init(trigger_ops, trigger_data);
ret = cmd_ops->reg(glob, trigger_data, file);
/* ret = event_trigger_register(cmd_ops, file, glob, trigger_data);
* The above returns on success the # of functions enabled, if (ret)
* but if it didn't find any functions it returns zero. goto out_free;
* Consider no functions a failure too.
*/
if (!ret) {
cmd_ops->unreg(glob, trigger_data, file);
ret = -ENOENT;
} else if (ret > 0)
ret = 0;
/* Down the counter of trigger_data or free it if not used anymore */ /* Down the counter of trigger_data or free it if not used anymore */
event_trigger_free(trigger_ops, trigger_data); event_trigger_free(trigger_ops, trigger_data);
...@@ -1854,7 +1835,7 @@ int event_enable_trigger_parse(struct event_command *cmd_ops, ...@@ -1854,7 +1835,7 @@ int event_enable_trigger_parse(struct event_command *cmd_ops,
trigger_data->private_data = enable_data; trigger_data->private_data = enable_data;
if (glob[0] == '!') { if (glob[0] == '!') {
cmd_ops->unreg(glob+1, trigger_data, file); event_trigger_unregister(cmd_ops, file, glob+1, trigger_data);
kfree(trigger_data); kfree(trigger_data);
kfree(enable_data); kfree(enable_data);
ret = 0; ret = 0;
...@@ -1901,19 +1882,11 @@ int event_enable_trigger_parse(struct event_command *cmd_ops, ...@@ -1901,19 +1882,11 @@ int event_enable_trigger_parse(struct event_command *cmd_ops,
ret = trace_event_enable_disable(event_enable_file, 1, 1); ret = trace_event_enable_disable(event_enable_file, 1, 1);
if (ret < 0) if (ret < 0)
goto out_put; goto out_put;
ret = cmd_ops->reg(glob, trigger_data, file);
/* ret = event_trigger_register(cmd_ops, file, glob, trigger_data);
* The above returns on success the # of functions enabled, if (ret)
* but if it didn't find any functions it returns zero.
* Consider no functions a failure too.
*/
if (!ret) {
ret = -ENOENT;
goto out_disable;
} else if (ret < 0)
goto out_disable; goto out_disable;
/* Just return zero, not the number of enabled functions */
ret = 0;
event_trigger_free(trigger_ops, trigger_data); event_trigger_free(trigger_ops, trigger_data);
out: out:
return ret; return ret;
...@@ -1959,13 +1932,12 @@ int event_enable_register_trigger(char *glob, ...@@ -1959,13 +1932,12 @@ int event_enable_register_trigger(char *glob,
} }
list_add_rcu(&data->list, &file->triggers); list_add_rcu(&data->list, &file->triggers);
ret++;
update_cond_flag(file); update_cond_flag(file);
if (trace_event_trigger_enable_disable(file, 1) < 0) { ret = trace_event_trigger_enable_disable(file, 1);
if (ret < 0) {
list_del_rcu(&data->list); list_del_rcu(&data->list);
update_cond_flag(file); update_cond_flag(file);
ret--;
} }
out: out:
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment