perf trace: Remember what are the syscalls tracepoint evsels
We will need to set filters on then. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Borislav Petkov <bp@suse.de> Cc: David Ahern <dsahern@gmail.com> Cc: Don Zickus <dzickus@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-u8hpgjpf3w8o1prnnjnwegwf@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
93ec4ce789
commit
c27366f0f9
|
@ -247,42 +247,6 @@ out_delete:
|
|||
({ struct syscall_tp *fields = evsel->priv; \
|
||||
fields->name.pointer(&fields->name, sample); })
|
||||
|
||||
static int perf_evlist__add_syscall_newtp(struct perf_evlist *evlist,
|
||||
void *sys_enter_handler,
|
||||
void *sys_exit_handler)
|
||||
{
|
||||
int ret = -1;
|
||||
struct perf_evsel *sys_enter, *sys_exit;
|
||||
|
||||
sys_enter = perf_evsel__syscall_newtp("sys_enter", sys_enter_handler);
|
||||
if (sys_enter == NULL)
|
||||
goto out;
|
||||
|
||||
if (perf_evsel__init_sc_tp_ptr_field(sys_enter, args))
|
||||
goto out_delete_sys_enter;
|
||||
|
||||
sys_exit = perf_evsel__syscall_newtp("sys_exit", sys_exit_handler);
|
||||
if (sys_exit == NULL)
|
||||
goto out_delete_sys_enter;
|
||||
|
||||
if (perf_evsel__init_sc_tp_uint_field(sys_exit, ret))
|
||||
goto out_delete_sys_exit;
|
||||
|
||||
perf_evlist__add(evlist, sys_enter);
|
||||
perf_evlist__add(evlist, sys_exit);
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
return ret;
|
||||
|
||||
out_delete_sys_exit:
|
||||
perf_evsel__delete_priv(sys_exit);
|
||||
out_delete_sys_enter:
|
||||
perf_evsel__delete_priv(sys_enter);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
struct syscall_arg {
|
||||
unsigned long val;
|
||||
struct thread *thread;
|
||||
|
@ -1307,6 +1271,10 @@ struct trace {
|
|||
struct {
|
||||
int max;
|
||||
struct syscall *table;
|
||||
struct {
|
||||
struct perf_evsel *enter,
|
||||
*exit;
|
||||
} events;
|
||||
} syscalls;
|
||||
struct record_opts opts;
|
||||
struct perf_evlist *evlist;
|
||||
|
@ -2283,6 +2251,44 @@ static void trace__handle_event(struct trace *trace, union perf_event *event, st
|
|||
}
|
||||
}
|
||||
|
||||
static int trace__add_syscall_newtp(struct trace *trace)
|
||||
{
|
||||
int ret = -1;
|
||||
struct perf_evlist *evlist = trace->evlist;
|
||||
struct perf_evsel *sys_enter, *sys_exit;
|
||||
|
||||
sys_enter = perf_evsel__syscall_newtp("sys_enter", trace__sys_enter);
|
||||
if (sys_enter == NULL)
|
||||
goto out;
|
||||
|
||||
if (perf_evsel__init_sc_tp_ptr_field(sys_enter, args))
|
||||
goto out_delete_sys_enter;
|
||||
|
||||
sys_exit = perf_evsel__syscall_newtp("sys_exit", trace__sys_exit);
|
||||
if (sys_exit == NULL)
|
||||
goto out_delete_sys_enter;
|
||||
|
||||
if (perf_evsel__init_sc_tp_uint_field(sys_exit, ret))
|
||||
goto out_delete_sys_exit;
|
||||
|
||||
perf_evlist__add(evlist, sys_enter);
|
||||
perf_evlist__add(evlist, sys_exit);
|
||||
|
||||
trace->syscalls.events.enter = sys_enter;
|
||||
trace->syscalls.events.exit = sys_exit;
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
return ret;
|
||||
|
||||
out_delete_sys_exit:
|
||||
perf_evsel__delete_priv(sys_exit);
|
||||
out_delete_sys_enter:
|
||||
perf_evsel__delete_priv(sys_enter);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
{
|
||||
struct perf_evlist *evlist = trace->evlist;
|
||||
|
@ -2293,9 +2299,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
|||
|
||||
trace->live = true;
|
||||
|
||||
if (trace->trace_syscalls &&
|
||||
perf_evlist__add_syscall_newtp(evlist, trace__sys_enter,
|
||||
trace__sys_exit))
|
||||
if (trace->trace_syscalls && trace__add_syscall_newtp(trace))
|
||||
goto out_error_raw_syscalls;
|
||||
|
||||
if (trace->trace_syscalls)
|
||||
|
|
Loading…
Reference in New Issue