perf trace: Beautify pid_t arguments
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: d1d438a3b1eb64eb99fc918d13a52ded3e941d67 Gitweb: http://git.kernel.org/tip/d1d438a3b1eb64eb99fc918d13a52ded3e941d67 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Wed, 6 Apr 2016 18:02:41 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 6 Apr 2016 19:36:30 -0300
perf trace: Beautify pid_t arguments
When reading the syscall tracepoint /format file, look for arguments of type "pid_t" and attach the PID beautifier, that will do a lookup on the threads it knows, i.e. the ones that came from PERF_RECORD_COMM events and add the COMM after the pid in such args:
Excerpt of a system wide trace for syscalls with pid_t args:
55602.977 ( 0.006 ms): bash/12122 setpgid(pid: 24347 (bash), pgid: 24347 (bash)) = 0
55603.024 ( 0.004 ms): bash/24347 setpgid(pid: 24347 (bash), pgid: 24347 (bash)) = 0
55691.527 (88.397 ms): bash/12122 wait4(upid: -1, stat_addr: 0x7ffe0cee1720, options: UNTRACED|CONTINUED) ... 55692.479 ( 0.952 ms): git/24347 wait4(upid: 24368, stat_addr: 0x7ffe030d5724) ...
55694.549 ( 2.070 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4fc10) = 24369 (pre-commit) 55694.575 ( 0.002 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4f650, options: NOHANG) = -1 ECHILD No child processes 55695.934 ( 0.010 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4f2d0, options: NOHANG) = 24370 (git) 55695.937 ( 0.001 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4f2d0, options: NOHANG) = -1 ECHILD No child processes 55717.963 ( 0.000 ms): pre-commit/24371 ... [continued]: wait4()) = 24372
55717.978 (21.468 ms): :24371/24371 wait4(upid: -1, stat_addr: 0x7ffc94f4f230) ...
55718.087 ( 0.109 ms): pre-commit/24371 wait4(upid: -1, stat_addr: 0x7ffc94f4f230) = 24373 (tr)
55718.187 ( 0.096 ms): pre-commit/24371 wait4(upid: -1, stat_addr: 0x7ffc94f4f230) = 24374 (wc)
55718.218 ( 0.002 ms): pre-commit/24371 wait4(upid: -1, stat_addr: 0x7ffc94f4eed0, options: NOHANG) = -1 ECHILD No child processes 55718.367 ( 0.005 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4f1d0, options: NOHANG) = 24371 (pre-commit) 55718.369 ( 0.001 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4f1d0, options: NOHANG) = -1 ECHILD No child processes 55741.021 (49.494 ms): git/24347 ... [continued]: wait4()) = 24368 (pre-commit)
74146.427 (18319.601 ms): git/24347 wait4(upid: 24375 (git), stat_addr: 0x7ffe030d6824) ...
74149.036 ( 0.891 ms): bash/24391 wait4(upid: -1, stat_addr: 0x7ffe0cee0560) = 24393 (sed)
--- tools/perf/builtin-trace.c | 110 ++++++++++++++++++++++-------------------- tools/perf/trace/beauty/pid.c | 18 +++++++ 2 files changed, 75 insertions(+), 53 deletions(-)
tools/perf/builtin-trace.c +57 -53
@@ -112,6 +112,58 @@# define PERF_FLAG_FD_CLOEXEC (1UL << 3)/* O_CLOEXEC */ #endif +struct trace { +struct perf_tool tool; +struct { +int machine; +int open_id; + } audit; +struct { +int max; +struct syscall *table; +struct { +struct perf_evsel *sys_enter, + *sys_exit; + } events; + } syscalls; +struct record_opts opts; +struct perf_evlist *evlist; +struct machine *host; +struct thread *current; +u64 base_time; +FILE *output; +unsigned long nr_events; +struct strlist *ev_qualifier; +struct { +size_t nr; +int *entries; + } ev_qualifier_ids; +struct intlist *tid_list; +struct intlist *pid_list; +struct { +size_t nr; +pid_t *entries; + } filter_pids; +double duration_filter; +double runtime_ms; +struct { +u64 vfs_getname, + proc_getname; + } stats; +bool not_ev_qualifier; +bool live; +bool full_time; +bool sched; +bool multiple_threads; +bool summary; +bool summary_only; +bool show_comm; +bool show_tool_stats; +bool trace_syscalls; +bool force; +bool vfs_getname; +int trace_pgfaults; +};struct tp_field {int offset;
@@ -1073,6 +1125,7 @@ static size_t syscall_arg__scnprintf_getrandom_flags(char *bf, size_t size, .arg_scnprintf = { [arg] = SCA_STRARRAY, }, \ .arg_parm = { [arg] = &strarray__##array, } +#include "trace/beauty/pid.c" #include "trace/beauty/sched_policy.c" #include "trace/beauty/waitid_options.c"
@@ -1167,6 +1220,7 @@ static struct syscall_fmt { .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, }, { .name = "getitimer", .errmsg = true, STRARRAY(0, which, itimers), }, { .name = "getpid", .errpid = true, }, + { .name = "getpgid", .errpid = true, }, { .name = "getppid", .errpid = true, }, { .name = "getrandom", .errmsg = true, .arg_scnprintf = { [2] = SCA_GETRANDOM_FLAGS, /* flags */ }, },
@@ -1328,6 +1382,7 @@ static struct syscall_fmt { [3] = SCA_MSG_FLAGS, /* flags */ }, }, { .name = "set_tid_address", .errpid = true, }, { .name = "setitimer", .errmsg = true, STRARRAY(0, which, itimers), }, + { .name = "setpgid", .errmsg = true, }, { .name = "setrlimit", .errmsg = true, STRARRAY(0, resource, rlimit_resources), }, { .name = "setxattr", .errmsg = true, .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
@@ -1485,59 +1540,6 @@ fail:static const size_t trace__entry_str_size =2048 ; -struct trace { -struct perf_tool tool; -struct { -int machine; -int open_id; - } audit; -struct { -int max; -struct syscall *table; -struct { -struct perf_evsel *sys_enter, - *sys_exit; - } events; - } syscalls; -struct record_opts opts; -struct perf_evlist *evlist; -struct machine *host; -struct thread *current; -u64 base_time; -FILE *output; -unsigned long nr_events; -struct strlist *ev_qualifier; -struct { -size_t nr; -int *entries; - } ev_qualifier_ids; -struct intlist *tid_list; -struct intlist *pid_list; -struct { -size_t nr; -pid_t *entries; - } filter_pids; -double duration_filter; -double runtime_ms; -struct { -u64 vfs_getname, - proc_getname; - } stats; -bool not_ev_qualifier; -bool live; -bool full_time; -bool sched; -bool multiple_threads; -bool summary; -bool summary_only; -bool show_comm; -bool show_tool_stats; -bool trace_syscalls; -bool force; -bool vfs_getname; -int trace_pgfaults; -}; -static int trace__set_fd_pathname (struct thread *thread,int fd,const char *pathname) {struct thread_trace *ttrace =thread__priv (thread);
@@ -1763,6 +1765,8 @@ static int syscall__set_arg_fmts(struct syscall *sc) sc->arg_scnprintf[idx] = sc->fmt->arg_scnprintf[idx]; else if (field->flags & FIELD_IS_POINTER) sc->arg_scnprintf[idx] = syscall_arg__scnprintf_hex; + else if (strcmp(field->type, "pid_t") == 0) + sc->arg_scnprintf[idx] = SCA_PID; ++idx; }
tools/perf/trace/beauty/pid.c new file +18 -0
@@ -0,0 +1,18 @@ +static size_t syscall_arg__scnprintf_pid (char *bf,size_t size,struct syscall_arg *arg) +{ +int pid = arg->val; +struct trace *trace = arg->trace; +size_t printed =scnprintf (bf, size,"%d" , pid); +struct thread *thread =machine__find_thread (trace->host, pid, pid); + +if (thread !=NULL ) { +if (thread->comm_set) + printed +=scnprintf (bf + printed, size - printed, +" (%s)" ,thread__comm_str (thread)); +thread__put (thread); + } + +return printed; +} + +#define SCA_PID syscall_arg__scnprintf_pid