[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210812005546.910833-3-rostedt@goodmis.org>
Date: Wed, 11 Aug 2021 20:55:46 -0400
From: Steven Rostedt <rostedt@...dmis.org>
To: linux-trace-devel@...r.kernel.org
Cc: linux-kernel@...r.kernel.org, Tom Zanussi <zanussi@...nel.org>,
Daniel Bristot de Oliveira <bristot@...hat.com>,
Masami Hiramatsu <mhiramat@...nel.org>,
"Steven Rostedt (VMware)" <rostedt@...dmis.org>
Subject: [PATCH 2/2] libtracefs: Have end event variables not be the end event field name
From: "Steven Rostedt (VMware)" <rostedt@...dmis.org>
Currently we have:
# sqlhist -n wakeup 'select end.next_pid, (end.TIMESTAMP - start.TIMESTAMP) as lat
from sched_waking as start join sched_switch as end on start.pid = end.next_pid'
produces:
echo 'wakeup s32 next_pid; u64 lat;' > /sys/kernel/tracing/synthetic_events
echo 'hist:keys=pid:__arg_18871_1=common_timestamp' > /sys/kernel/tracing/events/sched/sched_waking/trigger
echo 'hist:keys=next_pid:next_pid=next_pid,lat=common_timestamp-$__arg_18871_1:onmatch(sched.sched_waking).trace(wakeup,$next_pid,$lat)' > /sys/kernel/tracing/events/sched/sched_switch/trigger
The issue is that we have "next_pid=next_pid" where if we want to change
the above to use the "save" action:
hist:keys=next_pid:next_pid=next_pid,lat=common_timestamp-$__arg_18871_1:onmax($lat).save(next_pid)
It fails with:
hist:sched:sched_switch: error: Couldn't find field
Command: hist:keys=next_pid:next_pid=next_pid,lat=common_timestamp-$__arg_18871_1:onmax($lat).save(next_pid)
^
But by having the end vars be unique, then the above "save" works.
Signed-off-by: Steven Rostedt (VMware) <rostedt@...dmis.org>
---
src/tracefs-hist.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/src/tracefs-hist.c b/src/tracefs-hist.c
index 8783ef4364bd..1e6bde7880f2 100644
--- a/src/tracefs-hist.c
+++ b/src/tracefs-hist.c
@@ -851,16 +851,19 @@ struct tracefs_synth *tracefs_synth_init(struct tep_handle *tep,
static int add_synth_fields(struct tracefs_synth *synth,
const struct tep_format_field *field,
- const char *name)
+ const char *name, const char *var)
{
char **list;
char *str;
int ret;
- str = add_synth_field(field, name);
+ str = add_synth_field(field, name ? : field->name);
if (!str)
return -1;
+ if (!name)
+ name = var;
+
list = tracefs_list_add(synth->synthetic_fields, str);
free(str);
if (!list)
@@ -942,7 +945,7 @@ int tracefs_synth_add_match_field(struct tracefs_synth *synth,
if (ret < 0)
goto pop_lists;
- ret = add_synth_fields(synth, key_field, name);
+ ret = add_synth_fields(synth, key_field, name, NULL);
if (ret < 0)
goto pop_lists;
@@ -1061,7 +1064,7 @@ int tracefs_synth_add_compare_field(struct tracefs_synth *synth,
if (ret < 0)
goto out_free;
- ret = add_synth_fields(synth, start_field, name);
+ ret = add_synth_fields(synth, start_field, name, NULL);
if (ret < 0)
goto out_free;
@@ -1106,7 +1109,7 @@ __hidden int synth_add_start_field(struct tracefs_synth *synth,
if (ret)
goto out_free;
- ret = add_synth_fields(synth, field, name);
+ ret = add_synth_fields(synth, field, name, NULL);
if (ret)
goto out_free;
@@ -1178,6 +1181,7 @@ int tracefs_synth_add_end_field(struct tracefs_synth *synth,
const char *name)
{
const struct tep_format_field *field;
+ char *tmp_var = NULL;
int ret;
if (!synth || !end_field) {
@@ -1186,17 +1190,17 @@ int tracefs_synth_add_end_field(struct tracefs_synth *synth,
}
if (!name)
- name = end_field;
+ tmp_var = new_arg(synth);
if (!trace_verify_event_field(synth->end_event, end_field, &field))
return -1;
- ret = add_var(&synth->end_vars, name, end_field, false);
+ ret = add_var(&synth->end_vars, name ? : tmp_var, end_field, false);
if (ret)
goto out;
- ret = add_synth_fields(synth, field, name);
-
+ ret = add_synth_fields(synth, field, name, tmp_var);
+ free(tmp_var);
out:
return ret;
}
--
2.30.2
Powered by blists - more mailing lists