Commit c3e49506 authored by Tom Zanussi's avatar Tom Zanussi Committed by Steven Rostedt (VMware)

tracing: Split up onmatch action data

Currently, the onmatch action data binds the onmatch action to data
related to synthetic event generation.  Since we want to allow the
onmatch handler to potentially invoke a different action, and because
we expect other handlers to generate synthetic events, we need to
separate the data related to these two functions.

Also rename the onmatch data to something more descriptive, and create
and use common action data destroy function.

Link: http://lkml.kernel.org/r/b9abbf9aae69fe3920cdc8ddbcaad544dd258d78.1550100284.git.tom.zanussi@linux.intel.comSigned-off-by: default avatarTom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent 5032b381
...@@ -4700,6 +4700,7 @@ static const char readme_msg[] = ...@@ -4700,6 +4700,7 @@ static const char readme_msg[] =
"\t [:size=#entries]\n" "\t [:size=#entries]\n"
"\t [:pause][:continue][:clear]\n" "\t [:pause][:continue][:clear]\n"
"\t [:name=histname1]\n" "\t [:name=histname1]\n"
"\t [:<handler>.<action>]\n"
"\t [if <filter>]\n\n" "\t [if <filter>]\n\n"
"\t When a matching event is hit, an entry is added to a hash\n" "\t When a matching event is hit, an entry is added to a hash\n"
"\t table using the key(s) and value(s) named, and the value of a\n" "\t table using the key(s) and value(s) named, and the value of a\n"
...@@ -4741,7 +4742,16 @@ static const char readme_msg[] = ...@@ -4741,7 +4742,16 @@ static const char readme_msg[] =
"\t The enable_hist and disable_hist triggers can be used to\n" "\t The enable_hist and disable_hist triggers can be used to\n"
"\t have one event conditionally start and stop another event's\n" "\t have one event conditionally start and stop another event's\n"
"\t already-attached hist trigger. The syntax is analagous to\n" "\t already-attached hist trigger. The syntax is analagous to\n"
"\t the enable_event and disable_event triggers.\n" "\t the enable_event and disable_event triggers.\n\n"
"\t Hist trigger handlers and actions are executed whenever a\n"
"\t a histogram entry is added or updated. They take the form:\n\n"
"\t <handler>.<action>\n\n"
"\t The available handlers are:\n\n"
"\t onmatch(matching.event) - invoke on addition or update\n"
"\t onmax(var) - invoke if var exceeds current max\n\n"
"\t The available actions are:\n\n"
"\t <synthetic_event>(param list) - generate synthetic event\n"
"\t save(field,...) - save current event fields\n"
#endif #endif
; ;
......
...@@ -405,21 +405,22 @@ struct action_data { ...@@ -405,21 +405,22 @@ struct action_data {
unsigned int n_params; unsigned int n_params;
char *params[SYNTH_FIELDS_MAX]; char *params[SYNTH_FIELDS_MAX];
/*
* When a histogram trigger is hit, the values of any
* references to variables, including variables being passed
* as parameters to synthetic events, are collected into a
* var_ref_vals array. This var_ref_idx is the index of the
* first param in the array to be passed to the synthetic
* event invocation.
*/
unsigned int var_ref_idx;
struct synth_event *synth_event;
union { union {
struct { struct {
/* char *event;
* When a histogram trigger is hit, the values of any char *event_system;
* references to variables, including variables being passed } match_data;
* as parameters to synthetic events, are collected into a
* var_ref_vals array. This var_ref_idx is the index of the
* first param in the array to be passed to the synthetic
* event invocation.
*/
unsigned int var_ref_idx;
char *match_event;
char *match_event_system;
struct synth_event *synth_event;
} onmatch;
struct { struct {
char *var_str; char *var_str;
...@@ -1093,9 +1094,9 @@ static void action_trace(struct hist_trigger_data *hist_data, ...@@ -1093,9 +1094,9 @@ static void action_trace(struct hist_trigger_data *hist_data,
struct ring_buffer_event *rbe, void *key, struct ring_buffer_event *rbe, void *key,
struct action_data *data, u64 *var_ref_vals) struct action_data *data, u64 *var_ref_vals)
{ {
struct synth_event *event = data->onmatch.synth_event; struct synth_event *event = data->synth_event;
trace_synth(event, var_ref_vals, data->onmatch.var_ref_idx); trace_synth(event, var_ref_vals, data->var_ref_idx);
} }
struct hist_var_data { struct hist_var_data {
...@@ -1657,8 +1658,8 @@ find_match_var(struct hist_trigger_data *hist_data, char *var_name) ...@@ -1657,8 +1658,8 @@ find_match_var(struct hist_trigger_data *hist_data, char *var_name)
struct action_data *data = hist_data->actions[i]; struct action_data *data = hist_data->actions[i];
if (data->handler == HANDLER_ONMATCH) { if (data->handler == HANDLER_ONMATCH) {
char *system = data->onmatch.match_event_system; char *system = data->match_data.event_system;
char *event_name = data->onmatch.match_event; char *event_name = data->match_data.event;
file = find_var_file(tr, system, event_name, var_name); file = find_var_file(tr, system, event_name, var_name);
if (!file) if (!file)
...@@ -3425,22 +3426,33 @@ static void onmax_save(struct hist_trigger_data *hist_data, ...@@ -3425,22 +3426,33 @@ static void onmax_save(struct hist_trigger_data *hist_data,
update_max_vars(hist_data, elt, rbe, rec); update_max_vars(hist_data, elt, rbe, rec);
} }
static void onmax_destroy(struct action_data *data) static void action_data_destroy(struct action_data *data)
{ {
unsigned int i; unsigned int i;
destroy_hist_field(data->onmax.max_var, 0); lockdep_assert_held(&event_mutex);
destroy_hist_field(data->onmax.var, 0);
kfree(data->onmax.var_str);
kfree(data->action_name); kfree(data->action_name);
for (i = 0; i < data->n_params; i++) for (i = 0; i < data->n_params; i++)
kfree(data->params[i]); kfree(data->params[i]);
if (data->synth_event)
data->synth_event->ref--;
kfree(data); kfree(data);
} }
static void onmax_destroy(struct action_data *data)
{
destroy_hist_field(data->onmax.max_var, 0);
destroy_hist_field(data->onmax.var, 0);
kfree(data->onmax.var_str);
action_data_destroy(data);
}
static int action_create(struct hist_trigger_data *hist_data, static int action_create(struct hist_trigger_data *hist_data,
struct action_data *data); struct action_data *data);
...@@ -3620,21 +3632,10 @@ static struct action_data *onmax_parse(char *str, enum handler_id handler) ...@@ -3620,21 +3632,10 @@ static struct action_data *onmax_parse(char *str, enum handler_id handler)
static void onmatch_destroy(struct action_data *data) static void onmatch_destroy(struct action_data *data)
{ {
unsigned int i; kfree(data->match_data.event);
kfree(data->match_data.event_system);
lockdep_assert_held(&event_mutex);
kfree(data->onmatch.match_event); action_data_destroy(data);
kfree(data->onmatch.match_event_system);
kfree(data->action_name);
for (i = 0; i < data->n_params; i++)
kfree(data->params[i]);
if (data->onmatch.synth_event)
data->onmatch.synth_event->ref--;
kfree(data);
} }
static void destroy_field_var(struct field_var *field_var) static void destroy_field_var(struct field_var *field_var)
...@@ -3695,8 +3696,8 @@ trace_action_find_var(struct hist_trigger_data *hist_data, ...@@ -3695,8 +3696,8 @@ trace_action_find_var(struct hist_trigger_data *hist_data,
hist_field = find_target_event_var(hist_data, system, event, var); hist_field = find_target_event_var(hist_data, system, event, var);
if (!hist_field) { if (!hist_field) {
if (!system && data->handler == HANDLER_ONMATCH) { if (!system && data->handler == HANDLER_ONMATCH) {
system = data->onmatch.match_event_system; system = data->match_data.event_system;
event = data->onmatch.match_event; event = data->match_data.event;
} }
hist_field = find_event_var(hist_data, system, event, var); hist_field = find_event_var(hist_data, system, event, var);
...@@ -3735,8 +3736,8 @@ trace_action_create_field_var(struct hist_trigger_data *hist_data, ...@@ -3735,8 +3736,8 @@ trace_action_create_field_var(struct hist_trigger_data *hist_data,
* event. * event.
*/ */
if (!system && data->handler == HANDLER_ONMATCH) { if (!system && data->handler == HANDLER_ONMATCH) {
system = data->onmatch.match_event_system; system = data->match_data.event_system;
event = data->onmatch.match_event; event = data->match_data.event;
} }
/* /*
...@@ -3846,8 +3847,8 @@ static int trace_action_create(struct hist_trigger_data *hist_data, ...@@ -3846,8 +3847,8 @@ static int trace_action_create(struct hist_trigger_data *hist_data,
goto err; goto err;
} }
data->onmatch.synth_event = event; data->synth_event = event;
data->onmatch.var_ref_idx = var_ref_idx; data->var_ref_idx = var_ref_idx;
out: out:
return ret; return ret;
err: err:
...@@ -3933,14 +3934,14 @@ static struct action_data *onmatch_parse(struct trace_array *tr, char *str) ...@@ -3933,14 +3934,14 @@ static struct action_data *onmatch_parse(struct trace_array *tr, char *str)
goto free; goto free;
} }
data->onmatch.match_event = kstrdup(match_event, GFP_KERNEL); data->match_data.event = kstrdup(match_event, GFP_KERNEL);
if (!data->onmatch.match_event) { if (!data->match_data.event) {
ret = -ENOMEM; ret = -ENOMEM;
goto free; goto free;
} }
data->onmatch.match_event_system = kstrdup(match_event_system, GFP_KERNEL); data->match_data.event_system = kstrdup(match_event_system, GFP_KERNEL);
if (!data->onmatch.match_event_system) { if (!data->match_data.event_system) {
ret = -ENOMEM; ret = -ENOMEM;
goto free; goto free;
} }
...@@ -4511,8 +4512,8 @@ static void print_onmatch_spec(struct seq_file *m, ...@@ -4511,8 +4512,8 @@ static void print_onmatch_spec(struct seq_file *m,
struct hist_trigger_data *hist_data, struct hist_trigger_data *hist_data,
struct action_data *data) struct action_data *data)
{ {
seq_printf(m, ":onmatch(%s.%s).", data->onmatch.match_event_system, seq_printf(m, ":onmatch(%s.%s).", data->match_data.event_system,
data->onmatch.match_event); data->match_data.event);
seq_printf(m, "%s(", data->action_name); seq_printf(m, "%s(", data->action_name);
...@@ -4550,11 +4551,11 @@ static bool actions_match(struct hist_trigger_data *hist_data, ...@@ -4550,11 +4551,11 @@ static bool actions_match(struct hist_trigger_data *hist_data,
return false; return false;
if (data->handler == HANDLER_ONMATCH) { if (data->handler == HANDLER_ONMATCH) {
if (strcmp(data->onmatch.match_event_system, if (strcmp(data->match_data.event_system,
data_test->onmatch.match_event_system) != 0) data_test->match_data.event_system) != 0)
return false; return false;
if (strcmp(data->onmatch.match_event, if (strcmp(data->match_data.event,
data_test->onmatch.match_event) != 0) data_test->match_data.event) != 0)
return false; return false;
} else if (data->handler == HANDLER_ONMAX) { } else if (data->handler == HANDLER_ONMAX) {
if (strcmp(data->onmax.var_str, if (strcmp(data->onmax.var_str,
......
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