tracing: Consolidate some synth_event_trace code

The synth_event trace code contains some almost identical functions
and some small functions that are called only once - consolidate the
common code into single functions and fold in the small functions to
simplify the code overall.

Link: http://lkml.kernel.org/r/d1c8d8ad124a653b7543afe801d38c199ca5c20e.1580506712.git.zanussi@kernel.org

Signed-off-by: Tom Zanussi <zanussi@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
Tom Zanussi 2020-01-31 15:55:31 -06:00 committed by Steven Rostedt (VMware)
parent d380dcde9a
commit 249d7b2ef6

View File

@ -2053,24 +2053,72 @@ out:
}
EXPORT_SYMBOL_GPL(synth_event_trace_start);
static int save_synth_val(struct synth_field *field, u64 val,
struct synth_event_trace_state *trace_state)
static int __synth_event_add_val(const char *field_name, u64 val,
struct synth_event_trace_state *trace_state)
{
struct synth_trace_event *entry = trace_state->entry;
struct synth_field *field = NULL;
struct synth_trace_event *entry;
struct synth_event *event;
int i, ret = 0;
if (!trace_state) {
ret = -EINVAL;
goto out;
}
/* can't mix add_next_synth_val() with add_synth_val() */
if (field_name) {
if (trace_state->add_next) {
ret = -EINVAL;
goto out;
}
trace_state->add_name = true;
} else {
if (trace_state->add_name) {
ret = -EINVAL;
goto out;
}
trace_state->add_next = true;
}
if (!trace_state->enabled)
goto out;
event = trace_state->event;
if (trace_state->add_name) {
for (i = 0; i < event->n_fields; i++) {
field = event->fields[i];
if (strcmp(field->name, field_name) == 0)
break;
}
if (!field) {
ret = -EINVAL;
goto out;
}
} else {
if (trace_state->cur_field >= event->n_fields) {
ret = -EINVAL;
goto out;
}
field = event->fields[trace_state->cur_field++];
}
entry = trace_state->entry;
if (field->is_string) {
char *str_val = (char *)(long)val;
char *str_field;
if (!str_val)
return -EINVAL;
if (!str_val) {
ret = -EINVAL;
goto out;
}
str_field = (char *)&entry->fields[field->offset];
strscpy(str_field, str_val, STR_VAR_LEN_MAX);
} else
entry->fields[field->offset] = val;
return 0;
out:
return ret;
}
/**
@ -2104,54 +2152,10 @@ static int save_synth_val(struct synth_field *field, u64 val,
int synth_event_add_next_val(u64 val,
struct synth_event_trace_state *trace_state)
{
struct synth_field *field;
struct synth_event *event;
int ret = 0;
if (!trace_state) {
ret = -EINVAL;
goto out;
}
/* can't mix add_next_synth_val() with add_synth_val() */
if (trace_state->add_name) {
ret = -EINVAL;
goto out;
}
trace_state->add_next = true;
if (!trace_state->enabled)
goto out;
event = trace_state->event;
if (trace_state->cur_field >= event->n_fields) {
ret = -EINVAL;
goto out;
}
field = event->fields[trace_state->cur_field++];
ret = save_synth_val(field, val, trace_state);
out:
return ret;
return __synth_event_add_val(NULL, val, trace_state);
}
EXPORT_SYMBOL_GPL(synth_event_add_next_val);
static struct synth_field *find_synth_field(struct synth_event *event,
const char *field_name)
{
struct synth_field *field = NULL;
unsigned int i;
for (i = 0; i < event->n_fields; i++) {
field = event->fields[i];
if (strcmp(field->name, field_name) == 0)
return field;
}
return NULL;
}
/**
* synth_event_add_val - Add a named field's value to an open synth trace
* @field_name: The name of the synthetic event field value to set
@ -2183,38 +2187,7 @@ static struct synth_field *find_synth_field(struct synth_event *event,
int synth_event_add_val(const char *field_name, u64 val,
struct synth_event_trace_state *trace_state)
{
struct synth_trace_event *entry;
struct synth_event *event;
struct synth_field *field;
int ret = 0;
if (!trace_state) {
ret = -EINVAL;
goto out;
}
/* can't mix add_next_synth_val() with add_synth_val() */
if (trace_state->add_next) {
ret = -EINVAL;
goto out;
}
trace_state->add_name = true;
if (!trace_state->enabled)
goto out;
event = trace_state->event;
entry = trace_state->entry;
field = find_synth_field(event, field_name);
if (!field) {
ret = -EINVAL;
goto out;
}
ret = save_synth_val(field, val, trace_state);
out:
return ret;
return __synth_event_add_val(field_name, val, trace_state);
}
EXPORT_SYMBOL_GPL(synth_event_add_val);