perf trace: Store the syscall ids for the event qualifiers in a table
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 8b3ce7576598b8e3b746beb9e8d10c33bcc64edd Gitweb: http://git.kernel.org/tip/8b3ce7576598b8e3b746beb9e8d10c33bcc64edd Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Thu, 2 Jul 2015 18:28:11 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 6 Jul 2015 10:21:47 -0300
perf trace: Store the syscall ids for the event qualifiers in a table
That we will use to set a filter on raw_syscalls:sys_{enter,exit} events.
Cc Adrian Hunter <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc David Ahern <[email protected]>
Cc Don Zickus <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/builtin-trace.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-)
tools/perf/builtin-trace.c +29 -7
@@ -1272,8 +1272,8 @@ struct trace {int max;struct syscall *table;struct { -struct perf_evsel *enter, - *exit; +struct perf_evsel *sys_enter, + *sys_exit; } events; } syscalls;struct record_opts opts;
@@ -1284,6 +1284,10 @@ struct trace {FILE *output;unsigned long nr_events;struct strlist *ev_qualifier; +struct { +size_t nr; +int *entries; + } ev_qualifier_ids;const char *last_vfs_getname;struct intlist *tid_list;struct intlist *pid_list;
@@ -1587,13 +1591,27 @@ static int trace__read_syscall_info(struct trace *trace, int id)static int trace__validate_ev_qualifier (struct trace *trace) { -int err =0 ; +int err =0 , i;struct str_node *pos; + trace->ev_qualifier_ids.nr =strlist__nr_entries (trace->ev_qualifier); + trace->ev_qualifier_ids.entries =malloc (trace->ev_qualifier_ids.nr * +sizeof (trace->ev_qualifier_ids.entries[0 ])); + +if (trace->ev_qualifier_ids.entries ==NULL ) { +fputs ("Error:\tNot enough memory for allocating events qualifier ids\n" , + trace->output); + err = -EINVAL ; + goto out; + } + + i =0 ; +strlist__for_each (pos, trace->ev_qualifier) {const char *sc = pos->s; +int id =audit_name_to_syscall (sc, trace->audit.machine); -if (audit_name_to_syscall (sc, trace->audit.machine) <0 ) { +if (id <0 ) {if (err ==0 ) {fputs ("Error:\tInvalid syscall " , trace->output); err = -EINVAL ;
@@ -1603,13 +1621,17 @@ static int trace__validate_ev_qualifier(struct trace *trace)fputs (sc, trace->output); } + + trace->ev_qualifier_ids.entries[i++] = id; }if (err <0 ) {fputs ("\nHint:\ttry 'perf list syscalls:sys_enter_*'" "\nHint:\tand: 'man syscalls'\n" , trace->output); +zfree (&trace->ev_qualifier_ids.entries); + trace->ev_qualifier_ids.nr =0 ; } - +out:return err; }
@@ -2274,8 +2296,8 @@ static int trace__add_syscall_newtp(struct trace *trace)perf_evlist__add (evlist, sys_enter);perf_evlist__add (evlist, sys_exit); - trace->syscalls.events.enter = sys_enter; - trace->syscalls.events.exit = sys_exit; + trace->syscalls.events.sys_enter = sys_enter; + trace->syscalls.events.sys_exit = sys_exit; ret =0 ; out: