2013-06-11 15:29:18 +00:00
|
|
|
#include <traceevent/event-parse.h>
|
2012-09-26 23:05:56 +00:00
|
|
|
#include "builtin.h"
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
#include "util/color.h"
|
2013-08-22 19:49:54 +00:00
|
|
|
#include "util/debug.h"
|
2012-09-26 23:05:56 +00:00
|
|
|
#include "util/evlist.h"
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
#include "util/machine.h"
|
2013-08-29 04:29:52 +00:00
|
|
|
#include "util/session.h"
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
#include "util/thread.h"
|
2012-09-26 23:05:56 +00:00
|
|
|
#include "util/parse-options.h"
|
2013-08-09 15:28:31 +00:00
|
|
|
#include "util/strlist.h"
|
2013-08-29 04:29:53 +00:00
|
|
|
#include "util/intlist.h"
|
2012-09-26 23:05:56 +00:00
|
|
|
#include "util/thread_map.h"
|
|
|
|
|
|
|
|
#include <libaudit.h>
|
|
|
|
#include <stdlib.h>
|
2013-09-12 15:18:56 +00:00
|
|
|
#include <sys/eventfd.h>
|
perf trace: Add beautifier for mmap prot parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.984 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd62ae000
1.114 ( 0.016 ms): mmap(addr: 0, len: 125100, prot: READ, flags: 2, fd: 3, off: 0 ) = 0xd628f000
1.252 ( 0.020 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: 2050, fd: 3, off: 0) = 0xc1600000
1.282 ( 0.024 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.315 ( 0.026 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: 2066, fd: 3, off: 1757184) = 0xc19ad000
1.352 ( 0.017 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: 50, fd: 4294967295, off: 0) = 0xc19b3000
1.415 ( 0.011 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd628e000
1.440 ( 0.011 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd628c000
1.569 ( 0.019 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.591 ( 0.017 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.616 ( 0.016 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
2.105 ( 0.018 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: 2, fd: 3, off: 0 ) = 0xcfe9c000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-20 20:44:42 +00:00
|
|
|
#include <sys/mman.h>
|
2013-09-02 16:46:44 +00:00
|
|
|
#include <linux/futex.h>
|
2012-09-26 23:05:56 +00:00
|
|
|
|
2013-09-12 13:29:00 +00:00
|
|
|
/* For older distros: */
|
|
|
|
#ifndef MAP_STACK
|
|
|
|
# define MAP_STACK 0x20000
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef MADV_HWPOISON
|
|
|
|
# define MADV_HWPOISON 100
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef MADV_MERGEABLE
|
|
|
|
# define MADV_MERGEABLE 12
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef MADV_UNMERGEABLE
|
|
|
|
# define MADV_UNMERGEABLE 13
|
|
|
|
#endif
|
|
|
|
|
2013-09-03 15:20:12 +00:00
|
|
|
struct syscall_arg {
|
|
|
|
unsigned long val;
|
2013-09-24 14:04:32 +00:00
|
|
|
struct thread *thread;
|
|
|
|
struct trace *trace;
|
2013-09-03 18:50:28 +00:00
|
|
|
void *parm;
|
2013-09-03 15:20:12 +00:00
|
|
|
u8 idx;
|
|
|
|
u8 mask;
|
|
|
|
};
|
|
|
|
|
2013-09-03 18:50:28 +00:00
|
|
|
struct strarray {
|
2013-10-08 19:00:21 +00:00
|
|
|
int offset;
|
2013-09-03 18:50:28 +00:00
|
|
|
int nr_entries;
|
|
|
|
const char **entries;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define DEFINE_STRARRAY(array) struct strarray strarray__##array = { \
|
|
|
|
.nr_entries = ARRAY_SIZE(array), \
|
|
|
|
.entries = array, \
|
|
|
|
}
|
|
|
|
|
2013-10-08 19:00:21 +00:00
|
|
|
#define DEFINE_STRARRAY_OFFSET(array, off) struct strarray strarray__##array = { \
|
|
|
|
.offset = off, \
|
|
|
|
.nr_entries = ARRAY_SIZE(array), \
|
|
|
|
.entries = array, \
|
|
|
|
}
|
|
|
|
|
2013-10-08 20:17:43 +00:00
|
|
|
static size_t __syscall_arg__scnprintf_strarray(char *bf, size_t size,
|
|
|
|
const char *intfmt,
|
|
|
|
struct syscall_arg *arg)
|
2013-09-03 18:50:28 +00:00
|
|
|
{
|
|
|
|
struct strarray *sa = arg->parm;
|
2013-10-08 19:00:21 +00:00
|
|
|
int idx = arg->val - sa->offset;
|
2013-09-03 18:50:28 +00:00
|
|
|
|
|
|
|
if (idx < 0 || idx >= sa->nr_entries)
|
2013-10-08 20:17:43 +00:00
|
|
|
return scnprintf(bf, size, intfmt, arg->val);
|
2013-09-03 18:50:28 +00:00
|
|
|
|
|
|
|
return scnprintf(bf, size, "%s", sa->entries[idx]);
|
|
|
|
}
|
|
|
|
|
2013-10-08 20:17:43 +00:00
|
|
|
static size_t syscall_arg__scnprintf_strarray(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
return __syscall_arg__scnprintf_strarray(bf, size, "%d", arg);
|
|
|
|
}
|
|
|
|
|
2013-09-03 18:50:28 +00:00
|
|
|
#define SCA_STRARRAY syscall_arg__scnprintf_strarray
|
|
|
|
|
perf trace: Initial beautifier for ioctl's 'cmd' arg
[root@zoo linux]# trace -e ioctl | grep -v "cmd: 0x" | head -10
0.386 ( 0.001 ms): trace/1602 ioctl(fd: 1<pipe:[127057]>, cmd: TCGETS, arg: 0x7fff59fcb4d0 ) = -1 ENOTTY Inappropriate ioctl for device
1459.368 ( 0.002 ms): inotify_reader/10352 ioctl(fd: 18<anon_inode:inotify>, cmd: FIONREAD, arg: 0x7fb835228bcc ) = 0
1463.586 ( 0.002 ms): inotify_reader/10352 ioctl(fd: 18<anon_inode:inotify>, cmd: FIONREAD, arg: 0x7fb835228bcc ) = 0
1463.611 ( 0.002 ms): inotify_reader/10352 ioctl(fd: 18<anon_inode:inotify>, cmd: FIONREAD, arg: 0x7fb835228bcc ) = 0
3740.526 ( 0.002 ms): awk/1612 ioctl(fd: 1<pipe:[128265]>, cmd: TCGETS, arg: 0x7fff4d166b90 ) = -1 ENOTTY Inappropriate ioctl for device
3740.704 ( 0.001 ms): awk/1612 ioctl(fd: 3</proc/meminfo>, cmd: TCGETS, arg: 0x7fff4d1669a0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.550 ( 0.002 ms): ps/1614 ioctl(fd: 1<pipe:[128266]>, cmd: TIOCGWINSZ, arg: 0x7fff591762b0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.555 ( 0.003 ms): ps/1614 ioctl(fd: 2<socket:[19550]>, cmd: TIOCGWINSZ, arg: 0x7fff591762b0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.558 ( 0.002 ms): ps/1614 ioctl(cmd: TIOCGWINSZ, arg: 0x7fff591762b0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.572 ( 0.002 ms): ps/1614 ioctl(fd: 1<pipe:[128266]>, cmd: TCGETS, arg: 0x7fff59176220 ) = -1 ENOTTY Inappropriate ioctl for device
[root@zoo linux]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-afajwap3mr60dfl4qpdl1pxn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-10-08 20:43:20 +00:00
|
|
|
static size_t syscall_arg__scnprintf_strhexarray(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
return __syscall_arg__scnprintf_strarray(bf, size, "%#x", arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_STRHEXARRAY syscall_arg__scnprintf_strhexarray
|
|
|
|
|
2013-09-24 14:04:32 +00:00
|
|
|
static size_t syscall_arg__scnprintf_fd(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg);
|
|
|
|
|
|
|
|
#define SCA_FD syscall_arg__scnprintf_fd
|
|
|
|
|
|
|
|
static size_t syscall_arg__scnprintf_fd_at(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
int fd = arg->val;
|
|
|
|
|
|
|
|
if (fd == AT_FDCWD)
|
|
|
|
return scnprintf(bf, size, "CWD");
|
|
|
|
|
|
|
|
return syscall_arg__scnprintf_fd(bf, size, arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_FDAT syscall_arg__scnprintf_fd_at
|
|
|
|
|
|
|
|
static size_t syscall_arg__scnprintf_close_fd(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg);
|
|
|
|
|
|
|
|
#define SCA_CLOSE_FD syscall_arg__scnprintf_close_fd
|
|
|
|
|
2013-09-02 13:39:21 +00:00
|
|
|
static size_t syscall_arg__scnprintf_hex(char *bf, size_t size,
|
2013-09-03 15:20:12 +00:00
|
|
|
struct syscall_arg *arg)
|
2013-08-23 21:14:48 +00:00
|
|
|
{
|
2013-09-03 15:20:12 +00:00
|
|
|
return scnprintf(bf, size, "%#lx", arg->val);
|
2013-08-23 21:14:48 +00:00
|
|
|
}
|
|
|
|
|
2013-08-26 15:29:38 +00:00
|
|
|
#define SCA_HEX syscall_arg__scnprintf_hex
|
|
|
|
|
2013-09-02 13:39:21 +00:00
|
|
|
static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size,
|
2013-09-03 15:20:12 +00:00
|
|
|
struct syscall_arg *arg)
|
perf trace: Add beautifier for mmap prot parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.984 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd62ae000
1.114 ( 0.016 ms): mmap(addr: 0, len: 125100, prot: READ, flags: 2, fd: 3, off: 0 ) = 0xd628f000
1.252 ( 0.020 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: 2050, fd: 3, off: 0) = 0xc1600000
1.282 ( 0.024 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.315 ( 0.026 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: 2066, fd: 3, off: 1757184) = 0xc19ad000
1.352 ( 0.017 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: 50, fd: 4294967295, off: 0) = 0xc19b3000
1.415 ( 0.011 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd628e000
1.440 ( 0.011 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd628c000
1.569 ( 0.019 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.591 ( 0.017 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.616 ( 0.016 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
2.105 ( 0.018 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: 2, fd: 3, off: 0 ) = 0xcfe9c000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-20 20:44:42 +00:00
|
|
|
{
|
2013-09-03 15:20:12 +00:00
|
|
|
int printed = 0, prot = arg->val;
|
perf trace: Add beautifier for mmap prot parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.984 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd62ae000
1.114 ( 0.016 ms): mmap(addr: 0, len: 125100, prot: READ, flags: 2, fd: 3, off: 0 ) = 0xd628f000
1.252 ( 0.020 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: 2050, fd: 3, off: 0) = 0xc1600000
1.282 ( 0.024 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.315 ( 0.026 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: 2066, fd: 3, off: 1757184) = 0xc19ad000
1.352 ( 0.017 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: 50, fd: 4294967295, off: 0) = 0xc19b3000
1.415 ( 0.011 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd628e000
1.440 ( 0.011 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd628c000
1.569 ( 0.019 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.591 ( 0.017 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.616 ( 0.016 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
2.105 ( 0.018 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: 2, fd: 3, off: 0 ) = 0xcfe9c000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-20 20:44:42 +00:00
|
|
|
|
|
|
|
if (prot == PROT_NONE)
|
|
|
|
return scnprintf(bf, size, "NONE");
|
|
|
|
#define P_MMAP_PROT(n) \
|
|
|
|
if (prot & PROT_##n) { \
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
|
|
|
|
prot &= ~PROT_##n; \
|
|
|
|
}
|
|
|
|
|
|
|
|
P_MMAP_PROT(EXEC);
|
|
|
|
P_MMAP_PROT(READ);
|
|
|
|
P_MMAP_PROT(WRITE);
|
|
|
|
#ifdef PROT_SEM
|
|
|
|
P_MMAP_PROT(SEM);
|
|
|
|
#endif
|
|
|
|
P_MMAP_PROT(GROWSDOWN);
|
|
|
|
P_MMAP_PROT(GROWSUP);
|
|
|
|
#undef P_MMAP_PROT
|
|
|
|
|
|
|
|
if (prot)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", prot);
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot
|
|
|
|
|
2013-09-02 13:39:21 +00:00
|
|
|
static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size,
|
2013-09-03 15:20:12 +00:00
|
|
|
struct syscall_arg *arg)
|
perf trace: Add beautifier for mmap flags parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.992 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa60be000
1.108 ( 0.012 ms): mmap(addr: 0, len: 125100, prot: READ, flags: PRIVATE, fd: 3, off: 0 ) = 0xa609f000
1.209 ( 0.014 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3, off: 0) = 0xc1600000
1.232 ( 0.018 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.255 ( 0.018 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: PRIVATE|DENYWRITE|FIXED, fd: 3, off: 1757184) = 0xc19ad000
1.281 ( 0.011 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS|FIXED, fd: 4294967295, off: 0) = 0xc19b3000
1.328 ( 0.008 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609e000
1.346 ( 0.008 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609c000
1.443 ( 0.013 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.459 ( 0.011 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.477 ( 0.011 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
1.855 ( 0.013 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: PRIVATE, fd: 3, off: 0) = 0x9fcac000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-23 13:48:33 +00:00
|
|
|
{
|
2013-09-03 15:20:12 +00:00
|
|
|
int printed = 0, flags = arg->val;
|
perf trace: Add beautifier for mmap flags parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.992 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa60be000
1.108 ( 0.012 ms): mmap(addr: 0, len: 125100, prot: READ, flags: PRIVATE, fd: 3, off: 0 ) = 0xa609f000
1.209 ( 0.014 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3, off: 0) = 0xc1600000
1.232 ( 0.018 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.255 ( 0.018 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: PRIVATE|DENYWRITE|FIXED, fd: 3, off: 1757184) = 0xc19ad000
1.281 ( 0.011 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS|FIXED, fd: 4294967295, off: 0) = 0xc19b3000
1.328 ( 0.008 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609e000
1.346 ( 0.008 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609c000
1.443 ( 0.013 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.459 ( 0.011 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.477 ( 0.011 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
1.855 ( 0.013 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: PRIVATE, fd: 3, off: 0) = 0x9fcac000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-23 13:48:33 +00:00
|
|
|
|
|
|
|
#define P_MMAP_FLAG(n) \
|
|
|
|
if (flags & MAP_##n) { \
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
|
|
|
|
flags &= ~MAP_##n; \
|
|
|
|
}
|
|
|
|
|
|
|
|
P_MMAP_FLAG(SHARED);
|
|
|
|
P_MMAP_FLAG(PRIVATE);
|
2013-09-05 14:29:47 +00:00
|
|
|
#ifdef MAP_32BIT
|
perf trace: Add beautifier for mmap flags parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.992 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa60be000
1.108 ( 0.012 ms): mmap(addr: 0, len: 125100, prot: READ, flags: PRIVATE, fd: 3, off: 0 ) = 0xa609f000
1.209 ( 0.014 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3, off: 0) = 0xc1600000
1.232 ( 0.018 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.255 ( 0.018 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: PRIVATE|DENYWRITE|FIXED, fd: 3, off: 1757184) = 0xc19ad000
1.281 ( 0.011 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS|FIXED, fd: 4294967295, off: 0) = 0xc19b3000
1.328 ( 0.008 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609e000
1.346 ( 0.008 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609c000
1.443 ( 0.013 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.459 ( 0.011 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.477 ( 0.011 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
1.855 ( 0.013 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: PRIVATE, fd: 3, off: 0) = 0x9fcac000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-23 13:48:33 +00:00
|
|
|
P_MMAP_FLAG(32BIT);
|
2013-09-05 14:29:47 +00:00
|
|
|
#endif
|
perf trace: Add beautifier for mmap flags parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.992 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa60be000
1.108 ( 0.012 ms): mmap(addr: 0, len: 125100, prot: READ, flags: PRIVATE, fd: 3, off: 0 ) = 0xa609f000
1.209 ( 0.014 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3, off: 0) = 0xc1600000
1.232 ( 0.018 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.255 ( 0.018 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: PRIVATE|DENYWRITE|FIXED, fd: 3, off: 1757184) = 0xc19ad000
1.281 ( 0.011 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS|FIXED, fd: 4294967295, off: 0) = 0xc19b3000
1.328 ( 0.008 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609e000
1.346 ( 0.008 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609c000
1.443 ( 0.013 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.459 ( 0.011 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.477 ( 0.011 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
1.855 ( 0.013 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: PRIVATE, fd: 3, off: 0) = 0x9fcac000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-23 13:48:33 +00:00
|
|
|
P_MMAP_FLAG(ANONYMOUS);
|
|
|
|
P_MMAP_FLAG(DENYWRITE);
|
|
|
|
P_MMAP_FLAG(EXECUTABLE);
|
|
|
|
P_MMAP_FLAG(FILE);
|
|
|
|
P_MMAP_FLAG(FIXED);
|
|
|
|
P_MMAP_FLAG(GROWSDOWN);
|
2013-08-27 16:50:40 +00:00
|
|
|
#ifdef MAP_HUGETLB
|
perf trace: Add beautifier for mmap flags parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.992 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa60be000
1.108 ( 0.012 ms): mmap(addr: 0, len: 125100, prot: READ, flags: PRIVATE, fd: 3, off: 0 ) = 0xa609f000
1.209 ( 0.014 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3, off: 0) = 0xc1600000
1.232 ( 0.018 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.255 ( 0.018 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: PRIVATE|DENYWRITE|FIXED, fd: 3, off: 1757184) = 0xc19ad000
1.281 ( 0.011 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS|FIXED, fd: 4294967295, off: 0) = 0xc19b3000
1.328 ( 0.008 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609e000
1.346 ( 0.008 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609c000
1.443 ( 0.013 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.459 ( 0.011 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.477 ( 0.011 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
1.855 ( 0.013 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: PRIVATE, fd: 3, off: 0) = 0x9fcac000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-23 13:48:33 +00:00
|
|
|
P_MMAP_FLAG(HUGETLB);
|
2013-08-27 16:50:40 +00:00
|
|
|
#endif
|
perf trace: Add beautifier for mmap flags parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.992 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa60be000
1.108 ( 0.012 ms): mmap(addr: 0, len: 125100, prot: READ, flags: PRIVATE, fd: 3, off: 0 ) = 0xa609f000
1.209 ( 0.014 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3, off: 0) = 0xc1600000
1.232 ( 0.018 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.255 ( 0.018 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: PRIVATE|DENYWRITE|FIXED, fd: 3, off: 1757184) = 0xc19ad000
1.281 ( 0.011 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS|FIXED, fd: 4294967295, off: 0) = 0xc19b3000
1.328 ( 0.008 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609e000
1.346 ( 0.008 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609c000
1.443 ( 0.013 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.459 ( 0.011 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.477 ( 0.011 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
1.855 ( 0.013 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: PRIVATE, fd: 3, off: 0) = 0x9fcac000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-23 13:48:33 +00:00
|
|
|
P_MMAP_FLAG(LOCKED);
|
|
|
|
P_MMAP_FLAG(NONBLOCK);
|
|
|
|
P_MMAP_FLAG(NORESERVE);
|
|
|
|
P_MMAP_FLAG(POPULATE);
|
|
|
|
P_MMAP_FLAG(STACK);
|
|
|
|
#ifdef MAP_UNINITIALIZED
|
|
|
|
P_MMAP_FLAG(UNINITIALIZED);
|
|
|
|
#endif
|
|
|
|
#undef P_MMAP_FLAG
|
|
|
|
|
|
|
|
if (flags)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags
|
|
|
|
|
2013-09-02 13:39:21 +00:00
|
|
|
static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size,
|
2013-09-03 15:20:12 +00:00
|
|
|
struct syscall_arg *arg)
|
2013-08-23 13:06:41 +00:00
|
|
|
{
|
2013-09-03 15:20:12 +00:00
|
|
|
int behavior = arg->val;
|
2013-08-23 13:06:41 +00:00
|
|
|
|
|
|
|
switch (behavior) {
|
|
|
|
#define P_MADV_BHV(n) case MADV_##n: return scnprintf(bf, size, #n)
|
|
|
|
P_MADV_BHV(NORMAL);
|
|
|
|
P_MADV_BHV(RANDOM);
|
|
|
|
P_MADV_BHV(SEQUENTIAL);
|
|
|
|
P_MADV_BHV(WILLNEED);
|
|
|
|
P_MADV_BHV(DONTNEED);
|
|
|
|
P_MADV_BHV(REMOVE);
|
|
|
|
P_MADV_BHV(DONTFORK);
|
|
|
|
P_MADV_BHV(DOFORK);
|
|
|
|
P_MADV_BHV(HWPOISON);
|
|
|
|
#ifdef MADV_SOFT_OFFLINE
|
|
|
|
P_MADV_BHV(SOFT_OFFLINE);
|
|
|
|
#endif
|
|
|
|
P_MADV_BHV(MERGEABLE);
|
|
|
|
P_MADV_BHV(UNMERGEABLE);
|
2013-08-27 16:50:40 +00:00
|
|
|
#ifdef MADV_HUGEPAGE
|
2013-08-23 13:06:41 +00:00
|
|
|
P_MADV_BHV(HUGEPAGE);
|
2013-08-27 16:50:40 +00:00
|
|
|
#endif
|
|
|
|
#ifdef MADV_NOHUGEPAGE
|
2013-08-23 13:06:41 +00:00
|
|
|
P_MADV_BHV(NOHUGEPAGE);
|
2013-08-27 16:50:40 +00:00
|
|
|
#endif
|
2013-08-23 13:06:41 +00:00
|
|
|
#ifdef MADV_DONTDUMP
|
|
|
|
P_MADV_BHV(DONTDUMP);
|
|
|
|
#endif
|
|
|
|
#ifdef MADV_DODUMP
|
|
|
|
P_MADV_BHV(DODUMP);
|
|
|
|
#endif
|
|
|
|
#undef P_MADV_PHV
|
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return scnprintf(bf, size, "%#x", behavior);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_MADV_BHV syscall_arg__scnprintf_madvise_behavior
|
|
|
|
|
2013-09-20 14:49:50 +00:00
|
|
|
static size_t syscall_arg__scnprintf_flock(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
int printed = 0, op = arg->val;
|
|
|
|
|
|
|
|
if (op == 0)
|
|
|
|
return scnprintf(bf, size, "NONE");
|
|
|
|
#define P_CMD(cmd) \
|
|
|
|
if ((op & LOCK_##cmd) == LOCK_##cmd) { \
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #cmd); \
|
|
|
|
op &= ~LOCK_##cmd; \
|
|
|
|
}
|
|
|
|
|
|
|
|
P_CMD(SH);
|
|
|
|
P_CMD(EX);
|
|
|
|
P_CMD(NB);
|
|
|
|
P_CMD(UN);
|
|
|
|
P_CMD(MAND);
|
|
|
|
P_CMD(RW);
|
|
|
|
P_CMD(READ);
|
|
|
|
P_CMD(WRITE);
|
|
|
|
#undef P_OP
|
|
|
|
|
|
|
|
if (op)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", op);
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_FLOCK syscall_arg__scnprintf_flock
|
|
|
|
|
2013-09-03 15:20:12 +00:00
|
|
|
static size_t syscall_arg__scnprintf_futex_op(char *bf, size_t size, struct syscall_arg *arg)
|
2013-09-02 16:46:44 +00:00
|
|
|
{
|
|
|
|
enum syscall_futex_args {
|
|
|
|
SCF_UADDR = (1 << 0),
|
|
|
|
SCF_OP = (1 << 1),
|
|
|
|
SCF_VAL = (1 << 2),
|
|
|
|
SCF_TIMEOUT = (1 << 3),
|
|
|
|
SCF_UADDR2 = (1 << 4),
|
|
|
|
SCF_VAL3 = (1 << 5),
|
|
|
|
};
|
2013-09-03 15:20:12 +00:00
|
|
|
int op = arg->val;
|
2013-09-02 16:46:44 +00:00
|
|
|
int cmd = op & FUTEX_CMD_MASK;
|
|
|
|
size_t printed = 0;
|
|
|
|
|
|
|
|
switch (cmd) {
|
|
|
|
#define P_FUTEX_OP(n) case FUTEX_##n: printed = scnprintf(bf, size, #n);
|
2013-09-03 15:20:12 +00:00
|
|
|
P_FUTEX_OP(WAIT); arg->mask |= SCF_VAL3|SCF_UADDR2; break;
|
|
|
|
P_FUTEX_OP(WAKE); arg->mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break;
|
|
|
|
P_FUTEX_OP(FD); arg->mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break;
|
|
|
|
P_FUTEX_OP(REQUEUE); arg->mask |= SCF_VAL3|SCF_TIMEOUT; break;
|
|
|
|
P_FUTEX_OP(CMP_REQUEUE); arg->mask |= SCF_TIMEOUT; break;
|
|
|
|
P_FUTEX_OP(CMP_REQUEUE_PI); arg->mask |= SCF_TIMEOUT; break;
|
2013-09-02 16:46:44 +00:00
|
|
|
P_FUTEX_OP(WAKE_OP); break;
|
2013-09-03 15:20:12 +00:00
|
|
|
P_FUTEX_OP(LOCK_PI); arg->mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break;
|
|
|
|
P_FUTEX_OP(UNLOCK_PI); arg->mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break;
|
|
|
|
P_FUTEX_OP(TRYLOCK_PI); arg->mask |= SCF_VAL3|SCF_UADDR2; break;
|
|
|
|
P_FUTEX_OP(WAIT_BITSET); arg->mask |= SCF_UADDR2; break;
|
|
|
|
P_FUTEX_OP(WAKE_BITSET); arg->mask |= SCF_UADDR2; break;
|
2013-09-02 16:46:44 +00:00
|
|
|
P_FUTEX_OP(WAIT_REQUEUE_PI); break;
|
|
|
|
default: printed = scnprintf(bf, size, "%#x", cmd); break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (op & FUTEX_PRIVATE_FLAG)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "|PRIV");
|
|
|
|
|
|
|
|
if (op & FUTEX_CLOCK_REALTIME)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "|CLKRT");
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
2013-09-03 19:15:12 +00:00
|
|
|
#define SCA_FUTEX_OP syscall_arg__scnprintf_futex_op
|
|
|
|
|
2013-10-08 19:00:21 +00:00
|
|
|
static const char *epoll_ctl_ops[] = { "ADD", "DEL", "MOD", };
|
|
|
|
static DEFINE_STRARRAY_OFFSET(epoll_ctl_ops, 1);
|
perf trace: Beautify epoll_ctl 'op' arg
[root@sandy ~]# perf trace -e epoll_ctl
2.490 (0.003 ms): systemd-logind/586 epoll_ctl(epfd: 10, op: ADD, fd: 24, event: 0x7fff22314ef0) = 0
2.621 (0.003 ms): systemd-logind/586 epoll_ctl(epfd: 10, op: DEL, fd: 24 ) = 0
2.833 (0.010 ms): systemd-logind/586 epoll_ctl(epfd: 10, op: ADD, fd: 24, event: 0x7fff22314cd0) = 0
2.953 (0.002 ms): systemd-logind/586 epoll_ctl(epfd: 10, op: DEL, fd: 24 ) = 0
3.118 (0.002 ms): systemd-logind/586 epoll_ctl(epfd: 10, op: ADD, fd: 24, event: 0x7fff22314d20) = 0
4.762 (0.002 ms): systemd-logind/586 epoll_ctl(epfd: 10, op: DEL, fd: 24 ) = 0
^C[root@sandy ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-88xz9phc8cbicnxonud6if8h@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-20 14:27:32 +00:00
|
|
|
|
2013-09-03 18:50:28 +00:00
|
|
|
static const char *itimers[] = { "REAL", "VIRTUAL", "PROF", };
|
|
|
|
static DEFINE_STRARRAY(itimers);
|
|
|
|
|
2013-09-03 19:15:12 +00:00
|
|
|
static const char *whences[] = { "SET", "CUR", "END",
|
|
|
|
#ifdef SEEK_DATA
|
|
|
|
"DATA",
|
|
|
|
#endif
|
|
|
|
#ifdef SEEK_HOLE
|
|
|
|
"HOLE",
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
static DEFINE_STRARRAY(whences);
|
2013-09-02 16:46:44 +00:00
|
|
|
|
2013-09-03 19:28:58 +00:00
|
|
|
static const char *fcntl_cmds[] = {
|
|
|
|
"DUPFD", "GETFD", "SETFD", "GETFL", "SETFL", "GETLK", "SETLK",
|
|
|
|
"SETLKW", "SETOWN", "GETOWN", "SETSIG", "GETSIG", "F_GETLK64",
|
|
|
|
"F_SETLK64", "F_SETLKW64", "F_SETOWN_EX", "F_GETOWN_EX",
|
|
|
|
"F_GETOWNER_UIDS",
|
|
|
|
};
|
|
|
|
static DEFINE_STRARRAY(fcntl_cmds);
|
|
|
|
|
2013-09-04 14:52:33 +00:00
|
|
|
static const char *rlimit_resources[] = {
|
|
|
|
"CPU", "FSIZE", "DATA", "STACK", "CORE", "RSS", "NPROC", "NOFILE",
|
|
|
|
"MEMLOCK", "AS", "LOCKS", "SIGPENDING", "MSGQUEUE", "NICE", "RTPRIO",
|
|
|
|
"RTTIME",
|
|
|
|
};
|
|
|
|
static DEFINE_STRARRAY(rlimit_resources);
|
|
|
|
|
2013-09-03 19:37:46 +00:00
|
|
|
static const char *sighow[] = { "BLOCK", "UNBLOCK", "SETMASK", };
|
|
|
|
static DEFINE_STRARRAY(sighow);
|
|
|
|
|
2013-09-23 01:45:00 +00:00
|
|
|
static const char *clockid[] = {
|
|
|
|
"REALTIME", "MONOTONIC", "PROCESS_CPUTIME_ID", "THREAD_CPUTIME_ID",
|
|
|
|
"MONOTONIC_RAW", "REALTIME_COARSE", "MONOTONIC_COARSE",
|
|
|
|
};
|
|
|
|
static DEFINE_STRARRAY(clockid);
|
|
|
|
|
2013-09-04 13:27:41 +00:00
|
|
|
static const char *socket_families[] = {
|
|
|
|
"UNSPEC", "LOCAL", "INET", "AX25", "IPX", "APPLETALK", "NETROM",
|
|
|
|
"BRIDGE", "ATMPVC", "X25", "INET6", "ROSE", "DECnet", "NETBEUI",
|
|
|
|
"SECURITY", "KEY", "NETLINK", "PACKET", "ASH", "ECONET", "ATMSVC",
|
|
|
|
"RDS", "SNA", "IRDA", "PPPOX", "WANPIPE", "LLC", "IB", "CAN", "TIPC",
|
|
|
|
"BLUETOOTH", "IUCV", "RXRPC", "ISDN", "PHONET", "IEEE802154", "CAIF",
|
|
|
|
"ALG", "NFC", "VSOCK",
|
|
|
|
};
|
|
|
|
static DEFINE_STRARRAY(socket_families);
|
|
|
|
|
2013-09-04 14:00:44 +00:00
|
|
|
#ifndef SOCK_TYPE_MASK
|
|
|
|
#define SOCK_TYPE_MASK 0xf
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static size_t syscall_arg__scnprintf_socket_type(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
size_t printed;
|
|
|
|
int type = arg->val,
|
|
|
|
flags = type & ~SOCK_TYPE_MASK;
|
|
|
|
|
|
|
|
type &= SOCK_TYPE_MASK;
|
|
|
|
/*
|
|
|
|
* Can't use a strarray, MIPS may override for ABI reasons.
|
|
|
|
*/
|
|
|
|
switch (type) {
|
|
|
|
#define P_SK_TYPE(n) case SOCK_##n: printed = scnprintf(bf, size, #n); break;
|
|
|
|
P_SK_TYPE(STREAM);
|
|
|
|
P_SK_TYPE(DGRAM);
|
|
|
|
P_SK_TYPE(RAW);
|
|
|
|
P_SK_TYPE(RDM);
|
|
|
|
P_SK_TYPE(SEQPACKET);
|
|
|
|
P_SK_TYPE(DCCP);
|
|
|
|
P_SK_TYPE(PACKET);
|
|
|
|
#undef P_SK_TYPE
|
|
|
|
default:
|
|
|
|
printed = scnprintf(bf, size, "%#x", type);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define P_SK_FLAG(n) \
|
|
|
|
if (flags & SOCK_##n) { \
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "|%s", #n); \
|
|
|
|
flags &= ~SOCK_##n; \
|
|
|
|
}
|
|
|
|
|
|
|
|
P_SK_FLAG(CLOEXEC);
|
|
|
|
P_SK_FLAG(NONBLOCK);
|
|
|
|
#undef P_SK_FLAG
|
|
|
|
|
|
|
|
if (flags)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "|%#x", flags);
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_SK_TYPE syscall_arg__scnprintf_socket_type
|
|
|
|
|
perf trace: Beautify send/recv syscall 'flags' arg
[root@sandy ~]# perf trace -a -e recvmmsg,recvmsg,recvfrom,sendto,sendmsg,sendmmsg
6.901 (0.002 ms): 589 recvmsg(fd: 51, msg: 0x7fff35673420, flags: CMSG_CLOEXEC) = -1 EAGAIN Resource temporarily unavailable
6.966 (0.008 ms): 589 sendmsg(fd: 50, msg: 0x7fff35673230, flags: NOSIGNAL ) = 961
6.984 (0.004 ms): 979 sendmsg(fd: 3, msg: 0x7fff5b484940, flags: NOSIGNAL ) = 945
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-h25k5k50nac0ej5cl5iwgvae@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-12 14:54:48 +00:00
|
|
|
#ifndef MSG_PROBE
|
|
|
|
#define MSG_PROBE 0x10
|
|
|
|
#endif
|
2013-09-23 01:44:56 +00:00
|
|
|
#ifndef MSG_WAITFORONE
|
|
|
|
#define MSG_WAITFORONE 0x10000
|
|
|
|
#endif
|
perf trace: Beautify send/recv syscall 'flags' arg
[root@sandy ~]# perf trace -a -e recvmmsg,recvmsg,recvfrom,sendto,sendmsg,sendmmsg
6.901 (0.002 ms): 589 recvmsg(fd: 51, msg: 0x7fff35673420, flags: CMSG_CLOEXEC) = -1 EAGAIN Resource temporarily unavailable
6.966 (0.008 ms): 589 sendmsg(fd: 50, msg: 0x7fff35673230, flags: NOSIGNAL ) = 961
6.984 (0.004 ms): 979 sendmsg(fd: 3, msg: 0x7fff5b484940, flags: NOSIGNAL ) = 945
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-h25k5k50nac0ej5cl5iwgvae@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-12 14:54:48 +00:00
|
|
|
#ifndef MSG_SENDPAGE_NOTLAST
|
|
|
|
#define MSG_SENDPAGE_NOTLAST 0x20000
|
|
|
|
#endif
|
|
|
|
#ifndef MSG_FASTOPEN
|
|
|
|
#define MSG_FASTOPEN 0x20000000
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static size_t syscall_arg__scnprintf_msg_flags(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
int printed = 0, flags = arg->val;
|
|
|
|
|
|
|
|
if (flags == 0)
|
|
|
|
return scnprintf(bf, size, "NONE");
|
|
|
|
#define P_MSG_FLAG(n) \
|
|
|
|
if (flags & MSG_##n) { \
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
|
|
|
|
flags &= ~MSG_##n; \
|
|
|
|
}
|
|
|
|
|
|
|
|
P_MSG_FLAG(OOB);
|
|
|
|
P_MSG_FLAG(PEEK);
|
|
|
|
P_MSG_FLAG(DONTROUTE);
|
|
|
|
P_MSG_FLAG(TRYHARD);
|
|
|
|
P_MSG_FLAG(CTRUNC);
|
|
|
|
P_MSG_FLAG(PROBE);
|
|
|
|
P_MSG_FLAG(TRUNC);
|
|
|
|
P_MSG_FLAG(DONTWAIT);
|
|
|
|
P_MSG_FLAG(EOR);
|
|
|
|
P_MSG_FLAG(WAITALL);
|
|
|
|
P_MSG_FLAG(FIN);
|
|
|
|
P_MSG_FLAG(SYN);
|
|
|
|
P_MSG_FLAG(CONFIRM);
|
|
|
|
P_MSG_FLAG(RST);
|
|
|
|
P_MSG_FLAG(ERRQUEUE);
|
|
|
|
P_MSG_FLAG(NOSIGNAL);
|
|
|
|
P_MSG_FLAG(MORE);
|
|
|
|
P_MSG_FLAG(WAITFORONE);
|
|
|
|
P_MSG_FLAG(SENDPAGE_NOTLAST);
|
|
|
|
P_MSG_FLAG(FASTOPEN);
|
|
|
|
P_MSG_FLAG(CMSG_CLOEXEC);
|
|
|
|
#undef P_MSG_FLAG
|
|
|
|
|
|
|
|
if (flags)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_MSG_FLAGS syscall_arg__scnprintf_msg_flags
|
|
|
|
|
2013-09-04 14:42:27 +00:00
|
|
|
static size_t syscall_arg__scnprintf_access_mode(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
size_t printed = 0;
|
|
|
|
int mode = arg->val;
|
|
|
|
|
|
|
|
if (mode == F_OK) /* 0 */
|
|
|
|
return scnprintf(bf, size, "F");
|
|
|
|
#define P_MODE(n) \
|
|
|
|
if (mode & n##_OK) { \
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s", #n); \
|
|
|
|
mode &= ~n##_OK; \
|
|
|
|
}
|
|
|
|
|
|
|
|
P_MODE(R);
|
|
|
|
P_MODE(W);
|
|
|
|
P_MODE(X);
|
|
|
|
#undef P_MODE
|
|
|
|
|
|
|
|
if (mode)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "|%#x", mode);
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_ACCMODE syscall_arg__scnprintf_access_mode
|
|
|
|
|
2013-09-02 19:22:31 +00:00
|
|
|
static size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size,
|
2013-09-03 15:20:12 +00:00
|
|
|
struct syscall_arg *arg)
|
2013-09-02 19:22:31 +00:00
|
|
|
{
|
2013-09-03 15:20:12 +00:00
|
|
|
int printed = 0, flags = arg->val;
|
2013-09-02 19:22:31 +00:00
|
|
|
|
|
|
|
if (!(flags & O_CREAT))
|
2013-09-03 15:20:12 +00:00
|
|
|
arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */
|
2013-09-02 19:22:31 +00:00
|
|
|
|
|
|
|
if (flags == 0)
|
|
|
|
return scnprintf(bf, size, "RDONLY");
|
|
|
|
#define P_FLAG(n) \
|
|
|
|
if (flags & O_##n) { \
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
|
|
|
|
flags &= ~O_##n; \
|
|
|
|
}
|
|
|
|
|
|
|
|
P_FLAG(APPEND);
|
|
|
|
P_FLAG(ASYNC);
|
|
|
|
P_FLAG(CLOEXEC);
|
|
|
|
P_FLAG(CREAT);
|
|
|
|
P_FLAG(DIRECT);
|
|
|
|
P_FLAG(DIRECTORY);
|
|
|
|
P_FLAG(EXCL);
|
|
|
|
P_FLAG(LARGEFILE);
|
|
|
|
P_FLAG(NOATIME);
|
|
|
|
P_FLAG(NOCTTY);
|
|
|
|
#ifdef O_NONBLOCK
|
|
|
|
P_FLAG(NONBLOCK);
|
|
|
|
#elif O_NDELAY
|
|
|
|
P_FLAG(NDELAY);
|
|
|
|
#endif
|
|
|
|
#ifdef O_PATH
|
|
|
|
P_FLAG(PATH);
|
|
|
|
#endif
|
|
|
|
P_FLAG(RDWR);
|
|
|
|
#ifdef O_DSYNC
|
|
|
|
if ((flags & O_SYNC) == O_SYNC)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", "SYNC");
|
|
|
|
else {
|
|
|
|
P_FLAG(DSYNC);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
P_FLAG(SYNC);
|
|
|
|
#endif
|
|
|
|
P_FLAG(TRUNC);
|
|
|
|
P_FLAG(WRONLY);
|
|
|
|
#undef P_FLAG
|
|
|
|
|
|
|
|
if (flags)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags
|
|
|
|
|
2013-09-12 15:18:56 +00:00
|
|
|
static size_t syscall_arg__scnprintf_eventfd_flags(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
int printed = 0, flags = arg->val;
|
|
|
|
|
|
|
|
if (flags == 0)
|
|
|
|
return scnprintf(bf, size, "NONE");
|
|
|
|
#define P_FLAG(n) \
|
|
|
|
if (flags & EFD_##n) { \
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
|
|
|
|
flags &= ~EFD_##n; \
|
|
|
|
}
|
|
|
|
|
|
|
|
P_FLAG(SEMAPHORE);
|
|
|
|
P_FLAG(CLOEXEC);
|
|
|
|
P_FLAG(NONBLOCK);
|
|
|
|
#undef P_FLAG
|
|
|
|
|
|
|
|
if (flags)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_EFD_FLAGS syscall_arg__scnprintf_eventfd_flags
|
|
|
|
|
2013-09-23 15:52:04 +00:00
|
|
|
static size_t syscall_arg__scnprintf_pipe_flags(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
int printed = 0, flags = arg->val;
|
|
|
|
|
|
|
|
#define P_FLAG(n) \
|
|
|
|
if (flags & O_##n) { \
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
|
|
|
|
flags &= ~O_##n; \
|
|
|
|
}
|
|
|
|
|
|
|
|
P_FLAG(CLOEXEC);
|
|
|
|
P_FLAG(NONBLOCK);
|
|
|
|
#undef P_FLAG
|
|
|
|
|
|
|
|
if (flags)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_PIPE_FLAGS syscall_arg__scnprintf_pipe_flags
|
|
|
|
|
2013-09-03 20:17:15 +00:00
|
|
|
static size_t syscall_arg__scnprintf_signum(char *bf, size_t size, struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
int sig = arg->val;
|
|
|
|
|
|
|
|
switch (sig) {
|
|
|
|
#define P_SIGNUM(n) case SIG##n: return scnprintf(bf, size, #n)
|
|
|
|
P_SIGNUM(HUP);
|
|
|
|
P_SIGNUM(INT);
|
|
|
|
P_SIGNUM(QUIT);
|
|
|
|
P_SIGNUM(ILL);
|
|
|
|
P_SIGNUM(TRAP);
|
|
|
|
P_SIGNUM(ABRT);
|
|
|
|
P_SIGNUM(BUS);
|
|
|
|
P_SIGNUM(FPE);
|
|
|
|
P_SIGNUM(KILL);
|
|
|
|
P_SIGNUM(USR1);
|
|
|
|
P_SIGNUM(SEGV);
|
|
|
|
P_SIGNUM(USR2);
|
|
|
|
P_SIGNUM(PIPE);
|
|
|
|
P_SIGNUM(ALRM);
|
|
|
|
P_SIGNUM(TERM);
|
|
|
|
P_SIGNUM(STKFLT);
|
|
|
|
P_SIGNUM(CHLD);
|
|
|
|
P_SIGNUM(CONT);
|
|
|
|
P_SIGNUM(STOP);
|
|
|
|
P_SIGNUM(TSTP);
|
|
|
|
P_SIGNUM(TTIN);
|
|
|
|
P_SIGNUM(TTOU);
|
|
|
|
P_SIGNUM(URG);
|
|
|
|
P_SIGNUM(XCPU);
|
|
|
|
P_SIGNUM(XFSZ);
|
|
|
|
P_SIGNUM(VTALRM);
|
|
|
|
P_SIGNUM(PROF);
|
|
|
|
P_SIGNUM(WINCH);
|
|
|
|
P_SIGNUM(IO);
|
|
|
|
P_SIGNUM(PWR);
|
|
|
|
P_SIGNUM(SYS);
|
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return scnprintf(bf, size, "%#x", sig);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SCA_SIGNUM syscall_arg__scnprintf_signum
|
|
|
|
|
perf trace: Initial beautifier for ioctl's 'cmd' arg
[root@zoo linux]# trace -e ioctl | grep -v "cmd: 0x" | head -10
0.386 ( 0.001 ms): trace/1602 ioctl(fd: 1<pipe:[127057]>, cmd: TCGETS, arg: 0x7fff59fcb4d0 ) = -1 ENOTTY Inappropriate ioctl for device
1459.368 ( 0.002 ms): inotify_reader/10352 ioctl(fd: 18<anon_inode:inotify>, cmd: FIONREAD, arg: 0x7fb835228bcc ) = 0
1463.586 ( 0.002 ms): inotify_reader/10352 ioctl(fd: 18<anon_inode:inotify>, cmd: FIONREAD, arg: 0x7fb835228bcc ) = 0
1463.611 ( 0.002 ms): inotify_reader/10352 ioctl(fd: 18<anon_inode:inotify>, cmd: FIONREAD, arg: 0x7fb835228bcc ) = 0
3740.526 ( 0.002 ms): awk/1612 ioctl(fd: 1<pipe:[128265]>, cmd: TCGETS, arg: 0x7fff4d166b90 ) = -1 ENOTTY Inappropriate ioctl for device
3740.704 ( 0.001 ms): awk/1612 ioctl(fd: 3</proc/meminfo>, cmd: TCGETS, arg: 0x7fff4d1669a0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.550 ( 0.002 ms): ps/1614 ioctl(fd: 1<pipe:[128266]>, cmd: TIOCGWINSZ, arg: 0x7fff591762b0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.555 ( 0.003 ms): ps/1614 ioctl(fd: 2<socket:[19550]>, cmd: TIOCGWINSZ, arg: 0x7fff591762b0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.558 ( 0.002 ms): ps/1614 ioctl(cmd: TIOCGWINSZ, arg: 0x7fff591762b0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.572 ( 0.002 ms): ps/1614 ioctl(fd: 1<pipe:[128266]>, cmd: TCGETS, arg: 0x7fff59176220 ) = -1 ENOTTY Inappropriate ioctl for device
[root@zoo linux]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-afajwap3mr60dfl4qpdl1pxn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-10-08 20:43:20 +00:00
|
|
|
#define TCGETS 0x5401
|
|
|
|
|
|
|
|
static const char *tioctls[] = {
|
|
|
|
"TCGETS", "TCSETS", "TCSETSW", "TCSETSF", "TCGETA", "TCSETA", "TCSETAW",
|
|
|
|
"TCSETAF", "TCSBRK", "TCXONC", "TCFLSH", "TIOCEXCL", "TIOCNXCL",
|
|
|
|
"TIOCSCTTY", "TIOCGPGRP", "TIOCSPGRP", "TIOCOUTQ", "TIOCSTI",
|
|
|
|
"TIOCGWINSZ", "TIOCSWINSZ", "TIOCMGET", "TIOCMBIS", "TIOCMBIC",
|
|
|
|
"TIOCMSET", "TIOCGSOFTCAR", "TIOCSSOFTCAR", "FIONREAD", "TIOCLINUX",
|
|
|
|
"TIOCCONS", "TIOCGSERIAL", "TIOCSSERIAL", "TIOCPKT", "FIONBIO",
|
|
|
|
"TIOCNOTTY", "TIOCSETD", "TIOCGETD", "TCSBRKP", [0x27] = "TIOCSBRK",
|
|
|
|
"TIOCCBRK", "TIOCGSID", "TCGETS2", "TCSETS2", "TCSETSW2", "TCSETSF2",
|
|
|
|
"TIOCGRS485", "TIOCSRS485", "TIOCGPTN", "TIOCSPTLCK",
|
|
|
|
"TIOCGDEV||TCGETX", "TCSETX", "TCSETXF", "TCSETXW", "TIOCSIG",
|
|
|
|
"TIOCVHANGUP", "TIOCGPKT", "TIOCGPTLCK", "TIOCGEXCL",
|
|
|
|
[0x50] = "FIONCLEX", "FIOCLEX", "FIOASYNC", "TIOCSERCONFIG",
|
|
|
|
"TIOCSERGWILD", "TIOCSERSWILD", "TIOCGLCKTRMIOS", "TIOCSLCKTRMIOS",
|
|
|
|
"TIOCSERGSTRUCT", "TIOCSERGETLSR", "TIOCSERGETMULTI", "TIOCSERSETMULTI",
|
|
|
|
"TIOCMIWAIT", "TIOCGICOUNT", [0x60] = "FIOQSIZE",
|
|
|
|
};
|
|
|
|
|
|
|
|
static DEFINE_STRARRAY_OFFSET(tioctls, 0x5401);
|
|
|
|
|
2013-09-20 15:13:37 +00:00
|
|
|
#define STRARRAY(arg, name, array) \
|
|
|
|
.arg_scnprintf = { [arg] = SCA_STRARRAY, }, \
|
|
|
|
.arg_parm = { [arg] = &strarray__##array, }
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
static struct syscall_fmt {
|
|
|
|
const char *name;
|
2012-09-27 16:16:00 +00:00
|
|
|
const char *alias;
|
2013-09-03 15:20:12 +00:00
|
|
|
size_t (*arg_scnprintf[6])(char *bf, size_t size, struct syscall_arg *arg);
|
2013-09-03 18:50:28 +00:00
|
|
|
void *arg_parm[6];
|
2012-09-26 23:05:56 +00:00
|
|
|
bool errmsg;
|
|
|
|
bool timeout;
|
2013-08-26 14:36:30 +00:00
|
|
|
bool hexret;
|
2012-09-26 23:05:56 +00:00
|
|
|
} syscall_fmts[] = {
|
2013-09-04 14:42:27 +00:00
|
|
|
{ .name = "access", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [1] = SCA_ACCMODE, /* mode */ }, },
|
2012-09-27 16:16:00 +00:00
|
|
|
{ .name = "arch_prctl", .errmsg = true, .alias = "prctl", },
|
2013-08-26 15:29:38 +00:00
|
|
|
{ .name = "brk", .hexret = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_HEX, /* brk */ }, },
|
2013-09-23 01:45:00 +00:00
|
|
|
{ .name = "clock_gettime", .errmsg = true, STRARRAY(0, clk_id, clockid), },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "close", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_CLOSE_FD, /* fd */ }, },
|
2013-07-30 19:38:23 +00:00
|
|
|
{ .name = "connect", .errmsg = true, },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "dup", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "dup2", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "dup3", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
2013-09-20 15:13:37 +00:00
|
|
|
{ .name = "epoll_ctl", .errmsg = true, STRARRAY(1, op, epoll_ctl_ops), },
|
2013-09-12 15:18:56 +00:00
|
|
|
{ .name = "eventfd2", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [1] = SCA_EFD_FLAGS, /* flags */ }, },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "faccessat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
|
|
|
|
{ .name = "fadvise64", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "fallocate", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "fchdir", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "fchmod", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "fchmodat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
|
|
|
|
{ .name = "fchown", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "fchownat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
|
|
|
|
{ .name = "fcntl", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */
|
|
|
|
[1] = SCA_STRARRAY, /* cmd */ },
|
|
|
|
.arg_parm = { [1] = &strarray__fcntl_cmds, /* cmd */ }, },
|
|
|
|
{ .name = "fdatasync", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
2013-09-20 14:49:50 +00:00
|
|
|
{ .name = "flock", .errmsg = true,
|
2013-09-24 14:04:32 +00:00
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */
|
|
|
|
[1] = SCA_FLOCK, /* cmd */ }, },
|
|
|
|
{ .name = "fsetxattr", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "fstat", .errmsg = true, .alias = "newfstat",
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "fstatat", .errmsg = true, .alias = "newfstatat",
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
|
|
|
|
{ .name = "fstatfs", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "fsync", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "ftruncate", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
2013-09-02 16:46:44 +00:00
|
|
|
{ .name = "futex", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [1] = SCA_FUTEX_OP, /* op */ }, },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "futimesat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
|
|
|
|
{ .name = "getdents", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "getdents64", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
2013-09-20 15:13:37 +00:00
|
|
|
{ .name = "getitimer", .errmsg = true, STRARRAY(0, which, itimers), },
|
|
|
|
{ .name = "getrlimit", .errmsg = true, STRARRAY(0, resource, rlimit_resources), },
|
2013-08-26 15:29:38 +00:00
|
|
|
{ .name = "ioctl", .errmsg = true,
|
2013-09-24 14:04:32 +00:00
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */
|
perf trace: Initial beautifier for ioctl's 'cmd' arg
[root@zoo linux]# trace -e ioctl | grep -v "cmd: 0x" | head -10
0.386 ( 0.001 ms): trace/1602 ioctl(fd: 1<pipe:[127057]>, cmd: TCGETS, arg: 0x7fff59fcb4d0 ) = -1 ENOTTY Inappropriate ioctl for device
1459.368 ( 0.002 ms): inotify_reader/10352 ioctl(fd: 18<anon_inode:inotify>, cmd: FIONREAD, arg: 0x7fb835228bcc ) = 0
1463.586 ( 0.002 ms): inotify_reader/10352 ioctl(fd: 18<anon_inode:inotify>, cmd: FIONREAD, arg: 0x7fb835228bcc ) = 0
1463.611 ( 0.002 ms): inotify_reader/10352 ioctl(fd: 18<anon_inode:inotify>, cmd: FIONREAD, arg: 0x7fb835228bcc ) = 0
3740.526 ( 0.002 ms): awk/1612 ioctl(fd: 1<pipe:[128265]>, cmd: TCGETS, arg: 0x7fff4d166b90 ) = -1 ENOTTY Inappropriate ioctl for device
3740.704 ( 0.001 ms): awk/1612 ioctl(fd: 3</proc/meminfo>, cmd: TCGETS, arg: 0x7fff4d1669a0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.550 ( 0.002 ms): ps/1614 ioctl(fd: 1<pipe:[128266]>, cmd: TIOCGWINSZ, arg: 0x7fff591762b0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.555 ( 0.003 ms): ps/1614 ioctl(fd: 2<socket:[19550]>, cmd: TIOCGWINSZ, arg: 0x7fff591762b0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.558 ( 0.002 ms): ps/1614 ioctl(cmd: TIOCGWINSZ, arg: 0x7fff591762b0 ) = -1 ENOTTY Inappropriate ioctl for device
3742.572 ( 0.002 ms): ps/1614 ioctl(fd: 1<pipe:[128266]>, cmd: TCGETS, arg: 0x7fff59176220 ) = -1 ENOTTY Inappropriate ioctl for device
[root@zoo linux]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-afajwap3mr60dfl4qpdl1pxn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-10-08 20:43:20 +00:00
|
|
|
[1] = SCA_STRHEXARRAY, /* cmd */
|
|
|
|
[2] = SCA_HEX, /* arg */ },
|
|
|
|
.arg_parm = { [1] = &strarray__tioctls, /* cmd */ }, },
|
2013-09-03 20:17:15 +00:00
|
|
|
{ .name = "kill", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [1] = SCA_SIGNUM, /* sig */ }, },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "linkat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
|
|
|
|
{ .name = "lseek", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */
|
|
|
|
[2] = SCA_STRARRAY, /* whence */ },
|
|
|
|
.arg_parm = { [2] = &strarray__whences, /* whence */ }, },
|
2013-08-26 15:21:41 +00:00
|
|
|
{ .name = "lstat", .errmsg = true, .alias = "newlstat", },
|
2013-08-23 13:06:41 +00:00
|
|
|
{ .name = "madvise", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_HEX, /* start */
|
|
|
|
[2] = SCA_MADV_BHV, /* behavior */ }, },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "mkdirat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
|
|
|
|
{ .name = "mknodat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
|
2013-09-24 03:09:38 +00:00
|
|
|
{ .name = "mlock", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, },
|
|
|
|
{ .name = "mlockall", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, },
|
2013-08-26 15:29:38 +00:00
|
|
|
{ .name = "mmap", .hexret = true,
|
perf trace: Add beautifier for mmap prot parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.984 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd62ae000
1.114 ( 0.016 ms): mmap(addr: 0, len: 125100, prot: READ, flags: 2, fd: 3, off: 0 ) = 0xd628f000
1.252 ( 0.020 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: 2050, fd: 3, off: 0) = 0xc1600000
1.282 ( 0.024 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.315 ( 0.026 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: 2066, fd: 3, off: 1757184) = 0xc19ad000
1.352 ( 0.017 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: 50, fd: 4294967295, off: 0) = 0xc19b3000
1.415 ( 0.011 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd628e000
1.440 ( 0.011 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd628c000
1.569 ( 0.019 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.591 ( 0.017 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.616 ( 0.016 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
2.105 ( 0.018 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: 2, fd: 3, off: 0 ) = 0xcfe9c000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-20 20:44:42 +00:00
|
|
|
.arg_scnprintf = { [0] = SCA_HEX, /* addr */
|
perf trace: Add beautifier for mmap flags parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.992 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa60be000
1.108 ( 0.012 ms): mmap(addr: 0, len: 125100, prot: READ, flags: PRIVATE, fd: 3, off: 0 ) = 0xa609f000
1.209 ( 0.014 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3, off: 0) = 0xc1600000
1.232 ( 0.018 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.255 ( 0.018 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: PRIVATE|DENYWRITE|FIXED, fd: 3, off: 1757184) = 0xc19ad000
1.281 ( 0.011 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS|FIXED, fd: 4294967295, off: 0) = 0xc19b3000
1.328 ( 0.008 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609e000
1.346 ( 0.008 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: 4294967295, off: 0) = 0xa609c000
1.443 ( 0.013 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.459 ( 0.011 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.477 ( 0.011 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
1.855 ( 0.013 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: PRIVATE, fd: 3, off: 0) = 0x9fcac000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-23 13:48:33 +00:00
|
|
|
[2] = SCA_MMAP_PROT, /* prot */
|
|
|
|
[3] = SCA_MMAP_FLAGS, /* flags */ }, },
|
2013-08-26 15:29:38 +00:00
|
|
|
{ .name = "mprotect", .errmsg = true,
|
perf trace: Add beautifier for mmap prot parm
[root@zoo ~]# perf trace -e mmap,mprotect sleep 1
0.984 ( 0.015 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd62ae000
1.114 ( 0.016 ms): mmap(addr: 0, len: 125100, prot: READ, flags: 2, fd: 3, off: 0 ) = 0xd628f000
1.252 ( 0.020 ms): mmap(addr: 0x33c1600000, len: 3896312, prot: EXEC|READ, flags: 2050, fd: 3, off: 0) = 0xc1600000
1.282 ( 0.024 ms): mprotect(start: 0x33c17ad000, len: 2097152, prot: NONE ) = 0
1.315 ( 0.026 ms): mmap(addr: 0x33c19ad000, len: 24576, prot: READ|WRITE, flags: 2066, fd: 3, off: 1757184) = 0xc19ad000
1.352 ( 0.017 ms): mmap(addr: 0x33c19b3000, len: 17400, prot: READ|WRITE, flags: 50, fd: 4294967295, off: 0) = 0xc19b3000
1.415 ( 0.011 ms): mmap(addr: 0, len: 4096, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd628e000
1.440 ( 0.011 ms): mmap(addr: 0, len: 8192, prot: READ|WRITE, flags: 34, fd: 4294967295, off: 0) = 0xd628c000
1.569 ( 0.019 ms): mprotect(start: 0x606000, len: 4096, prot: READ ) = 0
1.591 ( 0.017 ms): mprotect(start: 0x33c19ad000, len: 16384, prot: READ ) = 0
1.616 ( 0.016 ms): mprotect(start: 0x33c1420000, len: 4096, prot: READ ) = 0
2.105 ( 0.018 ms): mmap(addr: 0, len: 104789808, prot: READ, flags: 2, fd: 3, off: 0 ) = 0xcfe9c000
[root@zoo ~]#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q1ubhdd9wigxneam616ggdsn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-20 20:44:42 +00:00
|
|
|
.arg_scnprintf = { [0] = SCA_HEX, /* start */
|
|
|
|
[2] = SCA_MMAP_PROT, /* prot */ }, },
|
|
|
|
{ .name = "mremap", .hexret = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_HEX, /* addr */
|
|
|
|
[4] = SCA_HEX, /* new_addr */ }, },
|
2013-09-24 03:09:38 +00:00
|
|
|
{ .name = "munlock", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, },
|
2013-08-26 15:29:38 +00:00
|
|
|
{ .name = "munmap", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "name_to_handle_at", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
|
|
|
|
{ .name = "newfstatat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
|
2013-09-02 19:22:31 +00:00
|
|
|
{ .name = "open", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [1] = SCA_OPEN_FLAGS, /* flags */ }, },
|
2013-09-02 19:40:40 +00:00
|
|
|
{ .name = "open_by_handle_at", .errmsg = true,
|
2013-09-24 14:04:32 +00:00
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
|
|
|
|
[2] = SCA_OPEN_FLAGS, /* flags */ }, },
|
2013-09-02 19:40:40 +00:00
|
|
|
{ .name = "openat", .errmsg = true,
|
2013-09-24 14:04:32 +00:00
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
|
|
|
|
[2] = SCA_OPEN_FLAGS, /* flags */ }, },
|
2013-09-23 15:52:04 +00:00
|
|
|
{ .name = "pipe2", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [1] = SCA_PIPE_FLAGS, /* flags */ }, },
|
2012-09-27 16:16:00 +00:00
|
|
|
{ .name = "poll", .errmsg = true, .timeout = true, },
|
|
|
|
{ .name = "ppoll", .errmsg = true, .timeout = true, },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "pread", .errmsg = true, .alias = "pread64",
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "preadv", .errmsg = true, .alias = "pread",
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
2013-09-20 15:13:37 +00:00
|
|
|
{ .name = "prlimit64", .errmsg = true, STRARRAY(1, resource, rlimit_resources), },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "pwrite", .errmsg = true, .alias = "pwrite64",
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "pwritev", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "read", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "readlinkat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
|
|
|
|
{ .name = "readv", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
perf trace: Beautify send/recv syscall 'flags' arg
[root@sandy ~]# perf trace -a -e recvmmsg,recvmsg,recvfrom,sendto,sendmsg,sendmmsg
6.901 (0.002 ms): 589 recvmsg(fd: 51, msg: 0x7fff35673420, flags: CMSG_CLOEXEC) = -1 EAGAIN Resource temporarily unavailable
6.966 (0.008 ms): 589 sendmsg(fd: 50, msg: 0x7fff35673230, flags: NOSIGNAL ) = 961
6.984 (0.004 ms): 979 sendmsg(fd: 3, msg: 0x7fff5b484940, flags: NOSIGNAL ) = 945
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-h25k5k50nac0ej5cl5iwgvae@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-12 14:54:48 +00:00
|
|
|
{ .name = "recvfrom", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
|
|
|
|
{ .name = "recvmmsg", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
|
|
|
|
{ .name = "recvmsg", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [2] = SCA_MSG_FLAGS, /* flags */ }, },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "renameat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
|
2013-09-03 20:17:15 +00:00
|
|
|
{ .name = "rt_sigaction", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_SIGNUM, /* sig */ }, },
|
2013-09-20 15:13:37 +00:00
|
|
|
{ .name = "rt_sigprocmask", .errmsg = true, STRARRAY(0, how, sighow), },
|
2013-09-03 20:17:15 +00:00
|
|
|
{ .name = "rt_sigqueueinfo", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [1] = SCA_SIGNUM, /* sig */ }, },
|
|
|
|
{ .name = "rt_tgsigqueueinfo", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [2] = SCA_SIGNUM, /* sig */ }, },
|
2012-09-27 16:16:00 +00:00
|
|
|
{ .name = "select", .errmsg = true, .timeout = true, },
|
perf trace: Beautify send/recv syscall 'flags' arg
[root@sandy ~]# perf trace -a -e recvmmsg,recvmsg,recvfrom,sendto,sendmsg,sendmmsg
6.901 (0.002 ms): 589 recvmsg(fd: 51, msg: 0x7fff35673420, flags: CMSG_CLOEXEC) = -1 EAGAIN Resource temporarily unavailable
6.966 (0.008 ms): 589 sendmsg(fd: 50, msg: 0x7fff35673230, flags: NOSIGNAL ) = 961
6.984 (0.004 ms): 979 sendmsg(fd: 3, msg: 0x7fff5b484940, flags: NOSIGNAL ) = 945
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-h25k5k50nac0ej5cl5iwgvae@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-12 14:54:48 +00:00
|
|
|
{ .name = "sendmmsg", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
|
|
|
|
{ .name = "sendmsg", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [2] = SCA_MSG_FLAGS, /* flags */ }, },
|
|
|
|
{ .name = "sendto", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
|
2013-09-20 15:13:37 +00:00
|
|
|
{ .name = "setitimer", .errmsg = true, STRARRAY(0, which, itimers), },
|
|
|
|
{ .name = "setrlimit", .errmsg = true, STRARRAY(0, resource, rlimit_resources), },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "shutdown", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
2013-09-04 13:27:41 +00:00
|
|
|
{ .name = "socket", .errmsg = true,
|
2013-09-04 14:00:44 +00:00
|
|
|
.arg_scnprintf = { [0] = SCA_STRARRAY, /* family */
|
|
|
|
[1] = SCA_SK_TYPE, /* type */ },
|
2013-09-20 15:24:20 +00:00
|
|
|
.arg_parm = { [0] = &strarray__socket_families, /* family */ }, },
|
|
|
|
{ .name = "socketpair", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_STRARRAY, /* family */
|
|
|
|
[1] = SCA_SK_TYPE, /* type */ },
|
2013-09-04 13:27:41 +00:00
|
|
|
.arg_parm = { [0] = &strarray__socket_families, /* family */ }, },
|
2012-09-27 16:16:00 +00:00
|
|
|
{ .name = "stat", .errmsg = true, .alias = "newstat", },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "symlinkat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
|
2013-09-03 20:17:15 +00:00
|
|
|
{ .name = "tgkill", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [2] = SCA_SIGNUM, /* sig */ }, },
|
|
|
|
{ .name = "tkill", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [1] = SCA_SIGNUM, /* sig */ }, },
|
2013-08-26 15:21:41 +00:00
|
|
|
{ .name = "uname", .errmsg = true, .alias = "newuname", },
|
2013-09-24 14:04:32 +00:00
|
|
|
{ .name = "unlinkat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
|
|
|
|
{ .name = "utimensat", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FDAT, /* dirfd */ }, },
|
|
|
|
{ .name = "write", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
|
|
|
{ .name = "writev", .errmsg = true,
|
|
|
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
2012-09-26 23:05:56 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static int syscall_fmt__cmp(const void *name, const void *fmtp)
|
|
|
|
{
|
|
|
|
const struct syscall_fmt *fmt = fmtp;
|
|
|
|
return strcmp(name, fmt->name);
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct syscall_fmt *syscall_fmt__find(const char *name)
|
|
|
|
{
|
|
|
|
const int nmemb = ARRAY_SIZE(syscall_fmts);
|
|
|
|
return bsearch(name, syscall_fmts, nmemb, sizeof(struct syscall_fmt), syscall_fmt__cmp);
|
|
|
|
}
|
|
|
|
|
|
|
|
struct syscall {
|
|
|
|
struct event_format *tp_format;
|
|
|
|
const char *name;
|
2013-08-09 15:28:31 +00:00
|
|
|
bool filtered;
|
2012-09-26 23:05:56 +00:00
|
|
|
struct syscall_fmt *fmt;
|
2013-09-03 15:20:12 +00:00
|
|
|
size_t (**arg_scnprintf)(char *bf, size_t size, struct syscall_arg *arg);
|
2013-09-03 18:50:28 +00:00
|
|
|
void **arg_parm;
|
2012-09-26 23:05:56 +00:00
|
|
|
};
|
|
|
|
|
perf trace: Add an event duration column
# perf trace usleep 1 | tail -10
0.453 ( 0.002 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763342848
0.456 ( 0.001 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763346944
0.459 ( 0.001 ms): arch_prctl(option: 4098, arg2: 140126839658240, arg3: 140126839652352, arg4: 34, arg5: 4294967295) = 0
0.473 ( 0.003 ms): mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
0.477 ( 0.003 ms): mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
0.483 ( 0.004 ms): munmap(addr: 140126839664640, len: 91882 ) = 0
0.540 ( 0.001 ms): brk(brk: 0 ) = 31928320
0.542 ( 0.002 ms): brk(brk: 32063488 ) = 32063488
1.456 ( 0.901 ms): nanosleep(rqtp: 140735472817168, rmtp: 0 ) = 0
1.462 ( 0.000 ms): exit_group(error_code: 0
#
This also comes from the tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-g9akh5hjw2kvjerpo9xror6f@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-24 19:24:47 +00:00
|
|
|
static size_t fprintf_duration(unsigned long t, FILE *fp)
|
|
|
|
{
|
|
|
|
double duration = (double)t / NSEC_PER_MSEC;
|
|
|
|
size_t printed = fprintf(fp, "(");
|
|
|
|
|
|
|
|
if (duration >= 1.0)
|
|
|
|
printed += color_fprintf(fp, PERF_COLOR_RED, "%6.3f ms", duration);
|
|
|
|
else if (duration >= 0.01)
|
|
|
|
printed += color_fprintf(fp, PERF_COLOR_YELLOW, "%6.3f ms", duration);
|
|
|
|
else
|
|
|
|
printed += color_fprintf(fp, PERF_COLOR_NORMAL, "%6.3f ms", duration);
|
2013-08-19 15:01:10 +00:00
|
|
|
return printed + fprintf(fp, "): ");
|
perf trace: Add an event duration column
# perf trace usleep 1 | tail -10
0.453 ( 0.002 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763342848
0.456 ( 0.001 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763346944
0.459 ( 0.001 ms): arch_prctl(option: 4098, arg2: 140126839658240, arg3: 140126839652352, arg4: 34, arg5: 4294967295) = 0
0.473 ( 0.003 ms): mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
0.477 ( 0.003 ms): mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
0.483 ( 0.004 ms): munmap(addr: 140126839664640, len: 91882 ) = 0
0.540 ( 0.001 ms): brk(brk: 0 ) = 31928320
0.542 ( 0.002 ms): brk(brk: 32063488 ) = 32063488
1.456 ( 0.901 ms): nanosleep(rqtp: 140735472817168, rmtp: 0 ) = 0
1.462 ( 0.000 ms): exit_group(error_code: 0
#
This also comes from the tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-g9akh5hjw2kvjerpo9xror6f@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-24 19:24:47 +00:00
|
|
|
}
|
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
struct thread_trace {
|
|
|
|
u64 entry_time;
|
|
|
|
u64 exit_time;
|
|
|
|
bool entry_pending;
|
2012-10-17 20:09:46 +00:00
|
|
|
unsigned long nr_events;
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
char *entry_str;
|
2012-10-17 20:13:12 +00:00
|
|
|
double runtime_ms;
|
2013-09-24 14:04:32 +00:00
|
|
|
struct {
|
|
|
|
int max;
|
|
|
|
char **table;
|
|
|
|
} paths;
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static struct thread_trace *thread_trace__new(void)
|
|
|
|
{
|
2013-09-24 14:04:32 +00:00
|
|
|
struct thread_trace *ttrace = zalloc(sizeof(struct thread_trace));
|
|
|
|
|
|
|
|
if (ttrace)
|
|
|
|
ttrace->paths.max = -1;
|
|
|
|
|
|
|
|
return ttrace;
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
}
|
|
|
|
|
2013-08-19 15:01:10 +00:00
|
|
|
static struct thread_trace *thread__trace(struct thread *thread, FILE *fp)
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
{
|
2012-10-17 20:09:46 +00:00
|
|
|
struct thread_trace *ttrace;
|
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
if (thread == NULL)
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
if (thread->priv == NULL)
|
|
|
|
thread->priv = thread_trace__new();
|
2012-10-17 20:09:46 +00:00
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
if (thread->priv == NULL)
|
|
|
|
goto fail;
|
|
|
|
|
2012-10-17 20:09:46 +00:00
|
|
|
ttrace = thread->priv;
|
|
|
|
++ttrace->nr_events;
|
|
|
|
|
|
|
|
return ttrace;
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
fail:
|
2013-08-19 15:01:10 +00:00
|
|
|
color_fprintf(fp, PERF_COLOR_RED,
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
"WARNING: not enough memory, dropping samples!\n");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
struct trace {
|
2013-08-19 15:01:10 +00:00
|
|
|
struct perf_tool tool;
|
2012-09-26 23:05:56 +00:00
|
|
|
int audit_machine;
|
|
|
|
struct {
|
|
|
|
int max;
|
|
|
|
struct syscall *table;
|
|
|
|
} syscalls;
|
|
|
|
struct perf_record_opts opts;
|
2013-09-28 19:13:00 +00:00
|
|
|
struct machine *host;
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
u64 base_time;
|
2013-09-04 18:37:43 +00:00
|
|
|
bool full_time;
|
2013-08-19 15:01:10 +00:00
|
|
|
FILE *output;
|
2012-10-17 20:09:46 +00:00
|
|
|
unsigned long nr_events;
|
2013-08-21 15:56:21 +00:00
|
|
|
struct strlist *ev_qualifier;
|
|
|
|
bool not_ev_qualifier;
|
2013-09-24 14:04:32 +00:00
|
|
|
bool live;
|
2013-08-29 04:29:53 +00:00
|
|
|
struct intlist *tid_list;
|
|
|
|
struct intlist *pid_list;
|
2012-10-17 20:13:12 +00:00
|
|
|
bool sched;
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
bool multiple_threads;
|
perf trace: Add option to show process COMM
Enabled by default, disable with --no-comm, e.g.:
181.821 (0.001 ms): deja-dup-monit/10784 recvmsg(fd: 8, msg: 0x7fff4342baf0, flags: PEEK|TRUNC|CMSG_CLOEXEC ) = 20
181.824 (0.001 ms): deja-dup-monit/10784 geteuid( ) = 1000
181.825 (0.001 ms): deja-dup-monit/10784 getegid( ) = 1000
181.834 (0.002 ms): deja-dup-monit/10784 recvmsg(fd: 8, msg: 0x7fff4342baf0, flags: CMSG_CLOEXEC ) = 20
181.836 (0.001 ms): deja-dup-monit/10784 geteuid( ) = 1000
181.838 (0.001 ms): deja-dup-monit/10784 getegid( ) = 1000
181.705 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: PEEK|TRUNC|CMSG_CLOEXEC) = 1256
181.710 (0.002 ms): evolution-addr/10924 geteuid( ) = 1000
181.712 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.727 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: CMSG_CLOEXEC ) = 1256
181.731 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.734 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.908 (0.002 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: PEEK|TRUNC|CMSG_CLOEXEC) = 20
181.913 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.915 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.930 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: CMSG_CLOEXEC ) = 20
181.934 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.937 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
220.718 (0.010 ms): at-spi2-regist/10715 sendmsg(fd: 3, msg: 0x7fffdb8756c0, flags: NOSIGNAL ) = 200
220.741 (0.000 ms): dbus-daemon/10711 ... [continued]: epoll_wait()) = 1
220.759 (0.004 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = 200
220.780 (0.002 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = 200
220.788 (0.001 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = -1 EAGAIN Resource temporarily unavailable
220.760 (0.004 ms): at-spi2-regist/10715 sendmsg(fd: 3, msg: 0x7fffdb8756c0, flags: NOSIGNAL ) = 200
220.771 (0.023 ms): perf/26347 open(filename: 0xf2e780, mode: 15918976 ) = 19
220.850 (0.002 ms): perf/26347 close(fd: 19 ) = 0
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-6be5jvnkdzjptdrebfn5263n@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-12 15:35:21 +00:00
|
|
|
bool show_comm;
|
perf trace: Add duration filter
Example:
[acme@sandy linux]$ perf trace --duration 0.025 usleep 1
2.221 ( 0.958 ms): 6724 execve(arg0: 140733557168278, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = -2
3.690 ( 1.443 ms): 6724 execve(arg0: 140733557168295, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = 0
3.979 ( 0.048 ms): 6724 open(filename: 208733843841, flags: 0, mode: 1 ) = 3
4.071 ( 0.075 ms): 6724 open(filename: 139744419925673, flags: 0, mode: 0 ) = 3
4.318 ( 0.056 ms): 6724 nanosleep(rqtp: 140734030404608, rmtp: 0 ) = 0
[acme@sandy linux]$ perf trace --duration 0.100 usleep 1
1.143 ( 1.021 ms): 6726 execve(arg0: 140736323962279, arg1: 140736323972752, arg2: 34926752, arg3: 140736323961824, arg4: 7955998171588342573, arg5: 6725) = 0
[acme@sandy linux]$
Cherry picked from tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-oslw2j2958we9qf0ctra4whd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-08 12:56:00 +00:00
|
|
|
double duration_filter;
|
2012-10-17 20:13:12 +00:00
|
|
|
double runtime_ms;
|
2012-09-26 23:05:56 +00:00
|
|
|
};
|
|
|
|
|
2013-09-24 14:04:32 +00:00
|
|
|
static int thread__read_fd_path(struct thread *thread, int fd)
|
|
|
|
{
|
|
|
|
struct thread_trace *ttrace = thread->priv;
|
|
|
|
char linkname[PATH_MAX], pathname[PATH_MAX];
|
|
|
|
struct stat st;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
if (thread->pid_ == thread->tid) {
|
|
|
|
scnprintf(linkname, sizeof(linkname),
|
|
|
|
"/proc/%d/fd/%d", thread->pid_, fd);
|
|
|
|
} else {
|
|
|
|
scnprintf(linkname, sizeof(linkname),
|
|
|
|
"/proc/%d/task/%d/fd/%d", thread->pid_, thread->tid, fd);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lstat(linkname, &st) < 0 || st.st_size + 1 > (off_t)sizeof(pathname))
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
ret = readlink(linkname, pathname, sizeof(pathname));
|
|
|
|
|
|
|
|
if (ret < 0 || ret > st.st_size)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
pathname[ret] = '\0';
|
|
|
|
|
|
|
|
if (fd > ttrace->paths.max) {
|
|
|
|
char **npath = realloc(ttrace->paths.table, (fd + 1) * sizeof(char *));
|
|
|
|
|
|
|
|
if (npath == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (ttrace->paths.max != -1) {
|
|
|
|
memset(npath + ttrace->paths.max + 1, 0,
|
|
|
|
(fd - ttrace->paths.max) * sizeof(char *));
|
|
|
|
} else {
|
|
|
|
memset(npath, 0, (fd + 1) * sizeof(char *));
|
|
|
|
}
|
|
|
|
|
|
|
|
ttrace->paths.table = npath;
|
|
|
|
ttrace->paths.max = fd;
|
|
|
|
}
|
|
|
|
|
|
|
|
ttrace->paths.table[fd] = strdup(pathname);
|
|
|
|
|
|
|
|
return ttrace->paths.table[fd] != NULL ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *thread__fd_path(struct thread *thread, int fd, bool live)
|
|
|
|
{
|
|
|
|
struct thread_trace *ttrace = thread->priv;
|
|
|
|
|
|
|
|
if (ttrace == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (fd < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if ((fd > ttrace->paths.max || ttrace->paths.table[fd] == NULL) &&
|
|
|
|
(!live || thread__read_fd_path(thread, fd)))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
return ttrace->paths.table[fd];
|
|
|
|
}
|
|
|
|
|
|
|
|
static size_t syscall_arg__scnprintf_fd(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
int fd = arg->val;
|
|
|
|
size_t printed = scnprintf(bf, size, "%d", fd);
|
|
|
|
const char *path = thread__fd_path(arg->thread, fd, arg->trace->live);
|
|
|
|
|
|
|
|
if (path)
|
|
|
|
printed += scnprintf(bf + printed, size - printed, "<%s>", path);
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
|
|
|
static size_t syscall_arg__scnprintf_close_fd(char *bf, size_t size,
|
|
|
|
struct syscall_arg *arg)
|
|
|
|
{
|
|
|
|
int fd = arg->val;
|
|
|
|
size_t printed = syscall_arg__scnprintf_fd(bf, size, arg);
|
|
|
|
struct thread_trace *ttrace = arg->thread->priv;
|
|
|
|
|
|
|
|
if (ttrace && fd >= 0 && fd <= ttrace->paths.max) {
|
|
|
|
free(ttrace->paths.table[fd]);
|
|
|
|
ttrace->paths.table[fd] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
perf trace: Add duration filter
Example:
[acme@sandy linux]$ perf trace --duration 0.025 usleep 1
2.221 ( 0.958 ms): 6724 execve(arg0: 140733557168278, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = -2
3.690 ( 1.443 ms): 6724 execve(arg0: 140733557168295, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = 0
3.979 ( 0.048 ms): 6724 open(filename: 208733843841, flags: 0, mode: 1 ) = 3
4.071 ( 0.075 ms): 6724 open(filename: 139744419925673, flags: 0, mode: 0 ) = 3
4.318 ( 0.056 ms): 6724 nanosleep(rqtp: 140734030404608, rmtp: 0 ) = 0
[acme@sandy linux]$ perf trace --duration 0.100 usleep 1
1.143 ( 1.021 ms): 6726 execve(arg0: 140736323962279, arg1: 140736323972752, arg2: 34926752, arg3: 140736323961824, arg4: 7955998171588342573, arg5: 6725) = 0
[acme@sandy linux]$
Cherry picked from tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-oslw2j2958we9qf0ctra4whd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-08 12:56:00 +00:00
|
|
|
static bool trace__filter_duration(struct trace *trace, double t)
|
|
|
|
{
|
|
|
|
return t < (trace->duration_filter * NSEC_PER_MSEC);
|
|
|
|
}
|
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
static size_t trace__fprintf_tstamp(struct trace *trace, u64 tstamp, FILE *fp)
|
|
|
|
{
|
|
|
|
double ts = (double)(tstamp - trace->base_time) / NSEC_PER_MSEC;
|
|
|
|
|
perf trace: Add an event duration column
# perf trace usleep 1 | tail -10
0.453 ( 0.002 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763342848
0.456 ( 0.001 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763346944
0.459 ( 0.001 ms): arch_prctl(option: 4098, arg2: 140126839658240, arg3: 140126839652352, arg4: 34, arg5: 4294967295) = 0
0.473 ( 0.003 ms): mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
0.477 ( 0.003 ms): mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
0.483 ( 0.004 ms): munmap(addr: 140126839664640, len: 91882 ) = 0
0.540 ( 0.001 ms): brk(brk: 0 ) = 31928320
0.542 ( 0.002 ms): brk(brk: 32063488 ) = 32063488
1.456 ( 0.901 ms): nanosleep(rqtp: 140735472817168, rmtp: 0 ) = 0
1.462 ( 0.000 ms): exit_group(error_code: 0
#
This also comes from the tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-g9akh5hjw2kvjerpo9xror6f@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-24 19:24:47 +00:00
|
|
|
return fprintf(fp, "%10.3f ", ts);
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
}
|
|
|
|
|
2012-10-05 05:02:16 +00:00
|
|
|
static bool done = false;
|
|
|
|
|
|
|
|
static void sig_handler(int sig __maybe_unused)
|
|
|
|
{
|
|
|
|
done = true;
|
|
|
|
}
|
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
static size_t trace__fprintf_entry_head(struct trace *trace, struct thread *thread,
|
perf trace: Add an event duration column
# perf trace usleep 1 | tail -10
0.453 ( 0.002 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763342848
0.456 ( 0.001 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763346944
0.459 ( 0.001 ms): arch_prctl(option: 4098, arg2: 140126839658240, arg3: 140126839652352, arg4: 34, arg5: 4294967295) = 0
0.473 ( 0.003 ms): mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
0.477 ( 0.003 ms): mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
0.483 ( 0.004 ms): munmap(addr: 140126839664640, len: 91882 ) = 0
0.540 ( 0.001 ms): brk(brk: 0 ) = 31928320
0.542 ( 0.002 ms): brk(brk: 32063488 ) = 32063488
1.456 ( 0.901 ms): nanosleep(rqtp: 140735472817168, rmtp: 0 ) = 0
1.462 ( 0.000 ms): exit_group(error_code: 0
#
This also comes from the tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-g9akh5hjw2kvjerpo9xror6f@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-24 19:24:47 +00:00
|
|
|
u64 duration, u64 tstamp, FILE *fp)
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
{
|
|
|
|
size_t printed = trace__fprintf_tstamp(trace, tstamp, fp);
|
perf trace: Add an event duration column
# perf trace usleep 1 | tail -10
0.453 ( 0.002 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763342848
0.456 ( 0.001 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763346944
0.459 ( 0.001 ms): arch_prctl(option: 4098, arg2: 140126839658240, arg3: 140126839652352, arg4: 34, arg5: 4294967295) = 0
0.473 ( 0.003 ms): mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
0.477 ( 0.003 ms): mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
0.483 ( 0.004 ms): munmap(addr: 140126839664640, len: 91882 ) = 0
0.540 ( 0.001 ms): brk(brk: 0 ) = 31928320
0.542 ( 0.002 ms): brk(brk: 32063488 ) = 32063488
1.456 ( 0.901 ms): nanosleep(rqtp: 140735472817168, rmtp: 0 ) = 0
1.462 ( 0.000 ms): exit_group(error_code: 0
#
This also comes from the tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-g9akh5hjw2kvjerpo9xror6f@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-24 19:24:47 +00:00
|
|
|
printed += fprintf_duration(duration, fp);
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
|
perf trace: Add option to show process COMM
Enabled by default, disable with --no-comm, e.g.:
181.821 (0.001 ms): deja-dup-monit/10784 recvmsg(fd: 8, msg: 0x7fff4342baf0, flags: PEEK|TRUNC|CMSG_CLOEXEC ) = 20
181.824 (0.001 ms): deja-dup-monit/10784 geteuid( ) = 1000
181.825 (0.001 ms): deja-dup-monit/10784 getegid( ) = 1000
181.834 (0.002 ms): deja-dup-monit/10784 recvmsg(fd: 8, msg: 0x7fff4342baf0, flags: CMSG_CLOEXEC ) = 20
181.836 (0.001 ms): deja-dup-monit/10784 geteuid( ) = 1000
181.838 (0.001 ms): deja-dup-monit/10784 getegid( ) = 1000
181.705 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: PEEK|TRUNC|CMSG_CLOEXEC) = 1256
181.710 (0.002 ms): evolution-addr/10924 geteuid( ) = 1000
181.712 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.727 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: CMSG_CLOEXEC ) = 1256
181.731 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.734 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.908 (0.002 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: PEEK|TRUNC|CMSG_CLOEXEC) = 20
181.913 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.915 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.930 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: CMSG_CLOEXEC ) = 20
181.934 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.937 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
220.718 (0.010 ms): at-spi2-regist/10715 sendmsg(fd: 3, msg: 0x7fffdb8756c0, flags: NOSIGNAL ) = 200
220.741 (0.000 ms): dbus-daemon/10711 ... [continued]: epoll_wait()) = 1
220.759 (0.004 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = 200
220.780 (0.002 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = 200
220.788 (0.001 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = -1 EAGAIN Resource temporarily unavailable
220.760 (0.004 ms): at-spi2-regist/10715 sendmsg(fd: 3, msg: 0x7fffdb8756c0, flags: NOSIGNAL ) = 200
220.771 (0.023 ms): perf/26347 open(filename: 0xf2e780, mode: 15918976 ) = 19
220.850 (0.002 ms): perf/26347 close(fd: 19 ) = 0
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-6be5jvnkdzjptdrebfn5263n@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-12 15:35:21 +00:00
|
|
|
if (trace->multiple_threads) {
|
|
|
|
if (trace->show_comm)
|
|
|
|
printed += fprintf(fp, "%.14s/", thread->comm);
|
2013-07-04 13:20:31 +00:00
|
|
|
printed += fprintf(fp, "%d ", thread->tid);
|
perf trace: Add option to show process COMM
Enabled by default, disable with --no-comm, e.g.:
181.821 (0.001 ms): deja-dup-monit/10784 recvmsg(fd: 8, msg: 0x7fff4342baf0, flags: PEEK|TRUNC|CMSG_CLOEXEC ) = 20
181.824 (0.001 ms): deja-dup-monit/10784 geteuid( ) = 1000
181.825 (0.001 ms): deja-dup-monit/10784 getegid( ) = 1000
181.834 (0.002 ms): deja-dup-monit/10784 recvmsg(fd: 8, msg: 0x7fff4342baf0, flags: CMSG_CLOEXEC ) = 20
181.836 (0.001 ms): deja-dup-monit/10784 geteuid( ) = 1000
181.838 (0.001 ms): deja-dup-monit/10784 getegid( ) = 1000
181.705 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: PEEK|TRUNC|CMSG_CLOEXEC) = 1256
181.710 (0.002 ms): evolution-addr/10924 geteuid( ) = 1000
181.712 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.727 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: CMSG_CLOEXEC ) = 1256
181.731 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.734 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.908 (0.002 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: PEEK|TRUNC|CMSG_CLOEXEC) = 20
181.913 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.915 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.930 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: CMSG_CLOEXEC ) = 20
181.934 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.937 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
220.718 (0.010 ms): at-spi2-regist/10715 sendmsg(fd: 3, msg: 0x7fffdb8756c0, flags: NOSIGNAL ) = 200
220.741 (0.000 ms): dbus-daemon/10711 ... [continued]: epoll_wait()) = 1
220.759 (0.004 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = 200
220.780 (0.002 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = 200
220.788 (0.001 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = -1 EAGAIN Resource temporarily unavailable
220.760 (0.004 ms): at-spi2-regist/10715 sendmsg(fd: 3, msg: 0x7fffdb8756c0, flags: NOSIGNAL ) = 200
220.771 (0.023 ms): perf/26347 open(filename: 0xf2e780, mode: 15918976 ) = 19
220.850 (0.002 ms): perf/26347 close(fd: 19 ) = 0
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-6be5jvnkdzjptdrebfn5263n@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-12 15:35:21 +00:00
|
|
|
}
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
2013-08-19 15:01:10 +00:00
|
|
|
static int trace__process_event(struct trace *trace, struct machine *machine,
|
|
|
|
union perf_event *event)
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
switch (event->header.type) {
|
|
|
|
case PERF_RECORD_LOST:
|
2013-08-19 15:01:10 +00:00
|
|
|
color_fprintf(trace->output, PERF_COLOR_RED,
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
"LOST %" PRIu64 " events!\n", event->lost.lost);
|
|
|
|
ret = machine__process_lost_event(machine, event);
|
|
|
|
default:
|
|
|
|
ret = machine__process_event(machine, event);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2013-08-19 15:01:10 +00:00
|
|
|
static int trace__tool_process(struct perf_tool *tool,
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
union perf_event *event,
|
|
|
|
struct perf_sample *sample __maybe_unused,
|
|
|
|
struct machine *machine)
|
|
|
|
{
|
2013-08-19 15:01:10 +00:00
|
|
|
struct trace *trace = container_of(tool, struct trace, tool);
|
|
|
|
return trace__process_event(trace, machine, event);
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int trace__symbols_init(struct trace *trace, struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
int err = symbol__init();
|
|
|
|
|
|
|
|
if (err)
|
|
|
|
return err;
|
|
|
|
|
2013-09-28 19:13:00 +00:00
|
|
|
trace->host = machine__new_host();
|
|
|
|
if (trace->host == NULL)
|
|
|
|
return -ENOMEM;
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
|
|
|
|
if (perf_target__has_task(&trace->opts.target)) {
|
2013-08-19 15:01:10 +00:00
|
|
|
err = perf_event__synthesize_thread_map(&trace->tool, evlist->threads,
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
trace__tool_process,
|
2013-09-28 19:13:00 +00:00
|
|
|
trace->host);
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
} else {
|
2013-08-19 15:01:10 +00:00
|
|
|
err = perf_event__synthesize_threads(&trace->tool, trace__tool_process,
|
2013-09-28 19:13:00 +00:00
|
|
|
trace->host);
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (err)
|
|
|
|
symbol__exit();
|
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2013-08-23 21:14:48 +00:00
|
|
|
static int syscall__set_arg_fmts(struct syscall *sc)
|
|
|
|
{
|
|
|
|
struct format_field *field;
|
|
|
|
int idx = 0;
|
|
|
|
|
|
|
|
sc->arg_scnprintf = calloc(sc->tp_format->format.nr_fields - 1, sizeof(void *));
|
|
|
|
if (sc->arg_scnprintf == NULL)
|
|
|
|
return -1;
|
|
|
|
|
2013-09-03 18:50:28 +00:00
|
|
|
if (sc->fmt)
|
|
|
|
sc->arg_parm = sc->fmt->arg_parm;
|
|
|
|
|
2013-08-23 21:14:48 +00:00
|
|
|
for (field = sc->tp_format->format.fields->next; field; field = field->next) {
|
2013-08-26 15:29:38 +00:00
|
|
|
if (sc->fmt && sc->fmt->arg_scnprintf[idx])
|
|
|
|
sc->arg_scnprintf[idx] = sc->fmt->arg_scnprintf[idx];
|
|
|
|
else if (field->flags & FIELD_IS_POINTER)
|
2013-08-23 21:14:48 +00:00
|
|
|
sc->arg_scnprintf[idx] = syscall_arg__scnprintf_hex;
|
|
|
|
++idx;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
static int trace__read_syscall_info(struct trace *trace, int id)
|
|
|
|
{
|
|
|
|
char tp_name[128];
|
|
|
|
struct syscall *sc;
|
2012-10-20 15:39:03 +00:00
|
|
|
const char *name = audit_syscall_to_name(id, trace->audit_machine);
|
|
|
|
|
|
|
|
if (name == NULL)
|
|
|
|
return -1;
|
2012-09-26 23:05:56 +00:00
|
|
|
|
|
|
|
if (id > trace->syscalls.max) {
|
|
|
|
struct syscall *nsyscalls = realloc(trace->syscalls.table, (id + 1) * sizeof(*sc));
|
|
|
|
|
|
|
|
if (nsyscalls == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (trace->syscalls.max != -1) {
|
|
|
|
memset(nsyscalls + trace->syscalls.max + 1, 0,
|
|
|
|
(id - trace->syscalls.max) * sizeof(*sc));
|
|
|
|
} else {
|
|
|
|
memset(nsyscalls, 0, (id + 1) * sizeof(*sc));
|
|
|
|
}
|
|
|
|
|
|
|
|
trace->syscalls.table = nsyscalls;
|
|
|
|
trace->syscalls.max = id;
|
|
|
|
}
|
|
|
|
|
|
|
|
sc = trace->syscalls.table + id;
|
2012-10-20 15:39:03 +00:00
|
|
|
sc->name = name;
|
2013-08-09 15:28:31 +00:00
|
|
|
|
2013-08-21 15:56:21 +00:00
|
|
|
if (trace->ev_qualifier) {
|
|
|
|
bool in = strlist__find(trace->ev_qualifier, name) != NULL;
|
|
|
|
|
|
|
|
if (!(in ^ trace->not_ev_qualifier)) {
|
|
|
|
sc->filtered = true;
|
|
|
|
/*
|
|
|
|
* No need to do read tracepoint information since this will be
|
|
|
|
* filtered out.
|
|
|
|
*/
|
|
|
|
return 0;
|
|
|
|
}
|
2013-08-09 15:28:31 +00:00
|
|
|
}
|
|
|
|
|
2012-10-20 15:39:03 +00:00
|
|
|
sc->fmt = syscall_fmt__find(sc->name);
|
2012-09-26 23:05:56 +00:00
|
|
|
|
2012-09-27 16:16:00 +00:00
|
|
|
snprintf(tp_name, sizeof(tp_name), "sys_enter_%s", sc->name);
|
2012-09-26 23:05:56 +00:00
|
|
|
sc->tp_format = event_format__new("syscalls", tp_name);
|
2012-09-27 16:16:00 +00:00
|
|
|
|
|
|
|
if (sc->tp_format == NULL && sc->fmt && sc->fmt->alias) {
|
|
|
|
snprintf(tp_name, sizeof(tp_name), "sys_enter_%s", sc->fmt->alias);
|
|
|
|
sc->tp_format = event_format__new("syscalls", tp_name);
|
|
|
|
}
|
2012-09-26 23:05:56 +00:00
|
|
|
|
2013-08-23 21:14:48 +00:00
|
|
|
if (sc->tp_format == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
return syscall__set_arg_fmts(sc);
|
2012-09-26 23:05:56 +00:00
|
|
|
}
|
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
|
2013-09-24 14:04:32 +00:00
|
|
|
unsigned long *args, struct trace *trace,
|
|
|
|
struct thread *thread)
|
2012-09-26 23:05:56 +00:00
|
|
|
{
|
|
|
|
size_t printed = 0;
|
|
|
|
|
|
|
|
if (sc->tp_format != NULL) {
|
|
|
|
struct format_field *field;
|
2013-09-03 15:20:12 +00:00
|
|
|
u8 bit = 1;
|
|
|
|
struct syscall_arg arg = {
|
2013-09-24 14:04:32 +00:00
|
|
|
.idx = 0,
|
|
|
|
.mask = 0,
|
|
|
|
.trace = trace,
|
|
|
|
.thread = thread,
|
2013-09-03 15:20:12 +00:00
|
|
|
};
|
2013-09-02 13:39:21 +00:00
|
|
|
|
|
|
|
for (field = sc->tp_format->format.fields->next; field;
|
2013-09-03 15:20:12 +00:00
|
|
|
field = field->next, ++arg.idx, bit <<= 1) {
|
|
|
|
if (arg.mask & bit)
|
2013-09-02 13:39:21 +00:00
|
|
|
continue;
|
2013-09-20 15:19:41 +00:00
|
|
|
/*
|
|
|
|
* Suppress this argument if its value is zero and
|
|
|
|
* and we don't have a string associated in an
|
|
|
|
* strarray for it.
|
|
|
|
*/
|
|
|
|
if (args[arg.idx] == 0 &&
|
|
|
|
!(sc->arg_scnprintf &&
|
|
|
|
sc->arg_scnprintf[arg.idx] == SCA_STRARRAY &&
|
|
|
|
sc->arg_parm[arg.idx]))
|
2013-09-12 14:27:34 +00:00
|
|
|
continue;
|
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
printed += scnprintf(bf + printed, size - printed,
|
2013-08-23 21:14:48 +00:00
|
|
|
"%s%s: ", printed ? ", " : "", field->name);
|
2013-09-03 15:20:12 +00:00
|
|
|
if (sc->arg_scnprintf && sc->arg_scnprintf[arg.idx]) {
|
|
|
|
arg.val = args[arg.idx];
|
2013-09-03 18:50:28 +00:00
|
|
|
if (sc->arg_parm)
|
|
|
|
arg.parm = sc->arg_parm[arg.idx];
|
2013-09-03 15:20:12 +00:00
|
|
|
printed += sc->arg_scnprintf[arg.idx](bf + printed,
|
|
|
|
size - printed, &arg);
|
2013-09-02 13:39:21 +00:00
|
|
|
} else {
|
2013-08-23 21:14:48 +00:00
|
|
|
printed += scnprintf(bf + printed, size - printed,
|
2013-09-03 15:20:12 +00:00
|
|
|
"%ld", args[arg.idx]);
|
2013-09-02 13:39:21 +00:00
|
|
|
}
|
2012-09-26 23:05:56 +00:00
|
|
|
}
|
|
|
|
} else {
|
2013-09-03 15:20:12 +00:00
|
|
|
int i = 0;
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
while (i < 6) {
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
printed += scnprintf(bf + printed, size - printed,
|
|
|
|
"%sarg%d: %ld",
|
|
|
|
printed ? ", " : "", i, args[i]);
|
2012-09-26 23:05:56 +00:00
|
|
|
++i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
2012-09-28 20:58:36 +00:00
|
|
|
typedef int (*tracepoint_handler)(struct trace *trace, struct perf_evsel *evsel,
|
|
|
|
struct perf_sample *sample);
|
|
|
|
|
|
|
|
static struct syscall *trace__syscall_info(struct trace *trace,
|
|
|
|
struct perf_evsel *evsel,
|
|
|
|
struct perf_sample *sample)
|
|
|
|
{
|
|
|
|
int id = perf_evsel__intval(evsel, sample, "id");
|
|
|
|
|
|
|
|
if (id < 0) {
|
2013-08-22 20:55:25 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* XXX: Noticed on x86_64, reproduced as far back as 3.0.36, haven't tried
|
|
|
|
* before that, leaving at a higher verbosity level till that is
|
|
|
|
* explained. Reproduced with plain ftrace with:
|
|
|
|
*
|
|
|
|
* echo 1 > /t/events/raw_syscalls/sys_exit/enable
|
|
|
|
* grep "NR -1 " /t/trace_pipe
|
|
|
|
*
|
|
|
|
* After generating some load on the machine.
|
|
|
|
*/
|
|
|
|
if (verbose > 1) {
|
|
|
|
static u64 n;
|
|
|
|
fprintf(trace->output, "Invalid syscall %d id, skipping (%s, %" PRIu64 ") ...\n",
|
|
|
|
id, perf_evsel__name(evsel), ++n);
|
|
|
|
}
|
2012-09-28 20:58:36 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((id > trace->syscalls.max || trace->syscalls.table[id].name == NULL) &&
|
|
|
|
trace__read_syscall_info(trace, id))
|
|
|
|
goto out_cant_read;
|
|
|
|
|
|
|
|
if ((id > trace->syscalls.max || trace->syscalls.table[id].name == NULL))
|
|
|
|
goto out_cant_read;
|
|
|
|
|
|
|
|
return &trace->syscalls.table[id];
|
|
|
|
|
|
|
|
out_cant_read:
|
2013-08-22 19:49:54 +00:00
|
|
|
if (verbose) {
|
|
|
|
fprintf(trace->output, "Problems reading syscall %d", id);
|
|
|
|
if (id <= trace->syscalls.max && trace->syscalls.table[id].name != NULL)
|
|
|
|
fprintf(trace->output, "(%s)", trace->syscalls.table[id].name);
|
|
|
|
fputs(" information\n", trace->output);
|
|
|
|
}
|
2012-09-28 20:58:36 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
|
|
|
|
struct perf_sample *sample)
|
|
|
|
{
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
char *msg;
|
2012-09-28 20:58:36 +00:00
|
|
|
void *args;
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
size_t printed = 0;
|
2013-08-09 15:28:31 +00:00
|
|
|
struct thread *thread;
|
2012-09-28 20:58:36 +00:00
|
|
|
struct syscall *sc = trace__syscall_info(trace, evsel, sample);
|
2013-08-09 15:28:31 +00:00
|
|
|
struct thread_trace *ttrace;
|
|
|
|
|
|
|
|
if (sc == NULL)
|
|
|
|
return -1;
|
2012-09-28 20:58:36 +00:00
|
|
|
|
2013-08-09 15:28:31 +00:00
|
|
|
if (sc->filtered)
|
|
|
|
return 0;
|
|
|
|
|
2013-09-28 19:13:00 +00:00
|
|
|
thread = machine__findnew_thread(trace->host, sample->pid, sample->tid);
|
2013-08-19 15:01:10 +00:00
|
|
|
ttrace = thread__trace(thread, trace->output);
|
2013-08-09 15:28:31 +00:00
|
|
|
if (ttrace == NULL)
|
2012-09-28 20:58:36 +00:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
args = perf_evsel__rawptr(evsel, sample, "args");
|
|
|
|
if (args == NULL) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Problems reading syscall arguments\n");
|
2012-09-28 20:58:36 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
ttrace = thread->priv;
|
|
|
|
|
|
|
|
if (ttrace->entry_str == NULL) {
|
|
|
|
ttrace->entry_str = malloc(1024);
|
|
|
|
if (!ttrace->entry_str)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
ttrace->entry_time = sample->time;
|
|
|
|
msg = ttrace->entry_str;
|
|
|
|
printed += scnprintf(msg + printed, 1024 - printed, "%s(", sc->name);
|
|
|
|
|
2013-09-24 14:04:32 +00:00
|
|
|
printed += syscall__scnprintf_args(sc, msg + printed, 1024 - printed,
|
|
|
|
args, trace, thread);
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
|
|
|
|
if (!strcmp(sc->name, "exit_group") || !strcmp(sc->name, "exit")) {
|
perf trace: Add duration filter
Example:
[acme@sandy linux]$ perf trace --duration 0.025 usleep 1
2.221 ( 0.958 ms): 6724 execve(arg0: 140733557168278, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = -2
3.690 ( 1.443 ms): 6724 execve(arg0: 140733557168295, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = 0
3.979 ( 0.048 ms): 6724 open(filename: 208733843841, flags: 0, mode: 1 ) = 3
4.071 ( 0.075 ms): 6724 open(filename: 139744419925673, flags: 0, mode: 0 ) = 3
4.318 ( 0.056 ms): 6724 nanosleep(rqtp: 140734030404608, rmtp: 0 ) = 0
[acme@sandy linux]$ perf trace --duration 0.100 usleep 1
1.143 ( 1.021 ms): 6726 execve(arg0: 140736323962279, arg1: 140736323972752, arg2: 34926752, arg3: 140736323961824, arg4: 7955998171588342573, arg5: 6725) = 0
[acme@sandy linux]$
Cherry picked from tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-oslw2j2958we9qf0ctra4whd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-08 12:56:00 +00:00
|
|
|
if (!trace->duration_filter) {
|
2013-08-19 15:01:10 +00:00
|
|
|
trace__fprintf_entry_head(trace, thread, 1, sample->time, trace->output);
|
|
|
|
fprintf(trace->output, "%-70s\n", ttrace->entry_str);
|
perf trace: Add duration filter
Example:
[acme@sandy linux]$ perf trace --duration 0.025 usleep 1
2.221 ( 0.958 ms): 6724 execve(arg0: 140733557168278, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = -2
3.690 ( 1.443 ms): 6724 execve(arg0: 140733557168295, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = 0
3.979 ( 0.048 ms): 6724 open(filename: 208733843841, flags: 0, mode: 1 ) = 3
4.071 ( 0.075 ms): 6724 open(filename: 139744419925673, flags: 0, mode: 0 ) = 3
4.318 ( 0.056 ms): 6724 nanosleep(rqtp: 140734030404608, rmtp: 0 ) = 0
[acme@sandy linux]$ perf trace --duration 0.100 usleep 1
1.143 ( 1.021 ms): 6726 execve(arg0: 140736323962279, arg1: 140736323972752, arg2: 34926752, arg3: 140736323961824, arg4: 7955998171588342573, arg5: 6725) = 0
[acme@sandy linux]$
Cherry picked from tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-oslw2j2958we9qf0ctra4whd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-08 12:56:00 +00:00
|
|
|
}
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
} else
|
|
|
|
ttrace->entry_pending = true;
|
2012-09-28 20:58:36 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
|
|
|
|
struct perf_sample *sample)
|
|
|
|
{
|
|
|
|
int ret;
|
perf trace: Add an event duration column
# perf trace usleep 1 | tail -10
0.453 ( 0.002 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763342848
0.456 ( 0.001 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763346944
0.459 ( 0.001 ms): arch_prctl(option: 4098, arg2: 140126839658240, arg3: 140126839652352, arg4: 34, arg5: 4294967295) = 0
0.473 ( 0.003 ms): mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
0.477 ( 0.003 ms): mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
0.483 ( 0.004 ms): munmap(addr: 140126839664640, len: 91882 ) = 0
0.540 ( 0.001 ms): brk(brk: 0 ) = 31928320
0.542 ( 0.002 ms): brk(brk: 32063488 ) = 32063488
1.456 ( 0.901 ms): nanosleep(rqtp: 140735472817168, rmtp: 0 ) = 0
1.462 ( 0.000 ms): exit_group(error_code: 0
#
This also comes from the tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-g9akh5hjw2kvjerpo9xror6f@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-24 19:24:47 +00:00
|
|
|
u64 duration = 0;
|
2013-08-09 15:28:31 +00:00
|
|
|
struct thread *thread;
|
2012-09-28 20:58:36 +00:00
|
|
|
struct syscall *sc = trace__syscall_info(trace, evsel, sample);
|
2013-08-09 15:28:31 +00:00
|
|
|
struct thread_trace *ttrace;
|
|
|
|
|
|
|
|
if (sc == NULL)
|
|
|
|
return -1;
|
2012-09-28 20:58:36 +00:00
|
|
|
|
2013-08-09 15:28:31 +00:00
|
|
|
if (sc->filtered)
|
|
|
|
return 0;
|
|
|
|
|
2013-09-28 19:13:00 +00:00
|
|
|
thread = machine__findnew_thread(trace->host, sample->pid, sample->tid);
|
2013-08-19 15:01:10 +00:00
|
|
|
ttrace = thread__trace(thread, trace->output);
|
2013-08-09 15:28:31 +00:00
|
|
|
if (ttrace == NULL)
|
2012-09-28 20:58:36 +00:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
ret = perf_evsel__intval(evsel, sample, "ret");
|
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
ttrace = thread->priv;
|
|
|
|
|
|
|
|
ttrace->exit_time = sample->time;
|
|
|
|
|
perf trace: Add duration filter
Example:
[acme@sandy linux]$ perf trace --duration 0.025 usleep 1
2.221 ( 0.958 ms): 6724 execve(arg0: 140733557168278, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = -2
3.690 ( 1.443 ms): 6724 execve(arg0: 140733557168295, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = 0
3.979 ( 0.048 ms): 6724 open(filename: 208733843841, flags: 0, mode: 1 ) = 3
4.071 ( 0.075 ms): 6724 open(filename: 139744419925673, flags: 0, mode: 0 ) = 3
4.318 ( 0.056 ms): 6724 nanosleep(rqtp: 140734030404608, rmtp: 0 ) = 0
[acme@sandy linux]$ perf trace --duration 0.100 usleep 1
1.143 ( 1.021 ms): 6726 execve(arg0: 140736323962279, arg1: 140736323972752, arg2: 34926752, arg3: 140736323961824, arg4: 7955998171588342573, arg5: 6725) = 0
[acme@sandy linux]$
Cherry picked from tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-oslw2j2958we9qf0ctra4whd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-08 12:56:00 +00:00
|
|
|
if (ttrace->entry_time) {
|
perf trace: Add an event duration column
# perf trace usleep 1 | tail -10
0.453 ( 0.002 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763342848
0.456 ( 0.001 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763346944
0.459 ( 0.001 ms): arch_prctl(option: 4098, arg2: 140126839658240, arg3: 140126839652352, arg4: 34, arg5: 4294967295) = 0
0.473 ( 0.003 ms): mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
0.477 ( 0.003 ms): mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
0.483 ( 0.004 ms): munmap(addr: 140126839664640, len: 91882 ) = 0
0.540 ( 0.001 ms): brk(brk: 0 ) = 31928320
0.542 ( 0.002 ms): brk(brk: 32063488 ) = 32063488
1.456 ( 0.901 ms): nanosleep(rqtp: 140735472817168, rmtp: 0 ) = 0
1.462 ( 0.000 ms): exit_group(error_code: 0
#
This also comes from the tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-g9akh5hjw2kvjerpo9xror6f@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-24 19:24:47 +00:00
|
|
|
duration = sample->time - ttrace->entry_time;
|
perf trace: Add duration filter
Example:
[acme@sandy linux]$ perf trace --duration 0.025 usleep 1
2.221 ( 0.958 ms): 6724 execve(arg0: 140733557168278, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = -2
3.690 ( 1.443 ms): 6724 execve(arg0: 140733557168295, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = 0
3.979 ( 0.048 ms): 6724 open(filename: 208733843841, flags: 0, mode: 1 ) = 3
4.071 ( 0.075 ms): 6724 open(filename: 139744419925673, flags: 0, mode: 0 ) = 3
4.318 ( 0.056 ms): 6724 nanosleep(rqtp: 140734030404608, rmtp: 0 ) = 0
[acme@sandy linux]$ perf trace --duration 0.100 usleep 1
1.143 ( 1.021 ms): 6726 execve(arg0: 140736323962279, arg1: 140736323972752, arg2: 34926752, arg3: 140736323961824, arg4: 7955998171588342573, arg5: 6725) = 0
[acme@sandy linux]$
Cherry picked from tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-oslw2j2958we9qf0ctra4whd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-08 12:56:00 +00:00
|
|
|
if (trace__filter_duration(trace, duration))
|
|
|
|
goto out;
|
|
|
|
} else if (trace->duration_filter)
|
|
|
|
goto out;
|
perf trace: Add an event duration column
# perf trace usleep 1 | tail -10
0.453 ( 0.002 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763342848
0.456 ( 0.001 ms): mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -763346944
0.459 ( 0.001 ms): arch_prctl(option: 4098, arg2: 140126839658240, arg3: 140126839652352, arg4: 34, arg5: 4294967295) = 0
0.473 ( 0.003 ms): mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
0.477 ( 0.003 ms): mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
0.483 ( 0.004 ms): munmap(addr: 140126839664640, len: 91882 ) = 0
0.540 ( 0.001 ms): brk(brk: 0 ) = 31928320
0.542 ( 0.002 ms): brk(brk: 32063488 ) = 32063488
1.456 ( 0.901 ms): nanosleep(rqtp: 140735472817168, rmtp: 0 ) = 0
1.462 ( 0.000 ms): exit_group(error_code: 0
#
This also comes from the tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-g9akh5hjw2kvjerpo9xror6f@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-24 19:24:47 +00:00
|
|
|
|
2013-08-19 15:01:10 +00:00
|
|
|
trace__fprintf_entry_head(trace, thread, duration, sample->time, trace->output);
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
|
|
|
|
if (ttrace->entry_pending) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "%-70s", ttrace->entry_str);
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
} else {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, " ... [");
|
|
|
|
color_fprintf(trace->output, PERF_COLOR_YELLOW, "continued");
|
|
|
|
fprintf(trace->output, "]: %s()", sc->name);
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
}
|
|
|
|
|
2013-08-26 14:28:34 +00:00
|
|
|
if (sc->fmt == NULL) {
|
|
|
|
signed_print:
|
|
|
|
fprintf(trace->output, ") = %d", ret);
|
|
|
|
} else if (ret < 0 && sc->fmt->errmsg) {
|
2012-09-28 20:58:36 +00:00
|
|
|
char bf[256];
|
|
|
|
const char *emsg = strerror_r(-ret, bf, sizeof(bf)),
|
|
|
|
*e = audit_errno_to_name(-ret);
|
|
|
|
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, ") = -1 %s %s", e, emsg);
|
2013-08-26 14:28:34 +00:00
|
|
|
} else if (ret == 0 && sc->fmt->timeout)
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, ") = 0 Timeout");
|
2013-08-26 14:36:30 +00:00
|
|
|
else if (sc->fmt->hexret)
|
|
|
|
fprintf(trace->output, ") = %#x", ret);
|
2012-09-28 20:58:36 +00:00
|
|
|
else
|
2013-08-26 14:28:34 +00:00
|
|
|
goto signed_print;
|
2012-09-28 20:58:36 +00:00
|
|
|
|
2013-08-19 15:01:10 +00:00
|
|
|
fputc('\n', trace->output);
|
perf trace: Add duration filter
Example:
[acme@sandy linux]$ perf trace --duration 0.025 usleep 1
2.221 ( 0.958 ms): 6724 execve(arg0: 140733557168278, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = -2
3.690 ( 1.443 ms): 6724 execve(arg0: 140733557168295, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = 0
3.979 ( 0.048 ms): 6724 open(filename: 208733843841, flags: 0, mode: 1 ) = 3
4.071 ( 0.075 ms): 6724 open(filename: 139744419925673, flags: 0, mode: 0 ) = 3
4.318 ( 0.056 ms): 6724 nanosleep(rqtp: 140734030404608, rmtp: 0 ) = 0
[acme@sandy linux]$ perf trace --duration 0.100 usleep 1
1.143 ( 1.021 ms): 6726 execve(arg0: 140736323962279, arg1: 140736323972752, arg2: 34926752, arg3: 140736323961824, arg4: 7955998171588342573, arg5: 6725) = 0
[acme@sandy linux]$
Cherry picked from tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-oslw2j2958we9qf0ctra4whd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-08 12:56:00 +00:00
|
|
|
out:
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
ttrace->entry_pending = false;
|
|
|
|
|
2012-09-28 20:58:36 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-17 20:13:12 +00:00
|
|
|
static int trace__sched_stat_runtime(struct trace *trace, struct perf_evsel *evsel,
|
|
|
|
struct perf_sample *sample)
|
|
|
|
{
|
|
|
|
u64 runtime = perf_evsel__intval(evsel, sample, "runtime");
|
|
|
|
double runtime_ms = (double)runtime / NSEC_PER_MSEC;
|
2013-09-28 19:13:00 +00:00
|
|
|
struct thread *thread = machine__findnew_thread(trace->host,
|
2013-08-27 08:23:03 +00:00
|
|
|
sample->pid,
|
|
|
|
sample->tid);
|
2013-08-19 15:01:10 +00:00
|
|
|
struct thread_trace *ttrace = thread__trace(thread, trace->output);
|
2012-10-17 20:13:12 +00:00
|
|
|
|
|
|
|
if (ttrace == NULL)
|
|
|
|
goto out_dump;
|
|
|
|
|
|
|
|
ttrace->runtime_ms += runtime_ms;
|
|
|
|
trace->runtime_ms += runtime_ms;
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
out_dump:
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "%s: comm=%s,pid=%u,runtime=%" PRIu64 ",vruntime=%" PRIu64 ")\n",
|
2012-10-17 20:13:12 +00:00
|
|
|
evsel->name,
|
|
|
|
perf_evsel__strval(evsel, sample, "comm"),
|
|
|
|
(pid_t)perf_evsel__intval(evsel, sample, "pid"),
|
|
|
|
runtime,
|
|
|
|
perf_evsel__intval(evsel, sample, "vruntime"));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-08-29 04:29:53 +00:00
|
|
|
static bool skip_sample(struct trace *trace, struct perf_sample *sample)
|
|
|
|
{
|
|
|
|
if ((trace->pid_list && intlist__find(trace->pid_list, sample->pid)) ||
|
|
|
|
(trace->tid_list && intlist__find(trace->tid_list, sample->tid)))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (trace->pid_list || trace->tid_list)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-08-29 04:29:52 +00:00
|
|
|
static int trace__process_sample(struct perf_tool *tool,
|
|
|
|
union perf_event *event __maybe_unused,
|
|
|
|
struct perf_sample *sample,
|
|
|
|
struct perf_evsel *evsel,
|
|
|
|
struct machine *machine __maybe_unused)
|
|
|
|
{
|
|
|
|
struct trace *trace = container_of(tool, struct trace, tool);
|
|
|
|
int err = 0;
|
|
|
|
|
|
|
|
tracepoint_handler handler = evsel->handler.func;
|
|
|
|
|
2013-08-29 04:29:53 +00:00
|
|
|
if (skip_sample(trace, sample))
|
|
|
|
return 0;
|
|
|
|
|
2013-09-04 18:37:43 +00:00
|
|
|
if (!trace->full_time && trace->base_time == 0)
|
2013-08-29 04:29:52 +00:00
|
|
|
trace->base_time = sample->time;
|
|
|
|
|
|
|
|
if (handler)
|
|
|
|
handler(trace, evsel, sample);
|
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool
|
|
|
|
perf_session__has_tp(struct perf_session *session, const char *name)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel;
|
|
|
|
|
|
|
|
evsel = perf_evlist__find_tracepoint_by_name(session->evlist, name);
|
|
|
|
|
|
|
|
return evsel != NULL;
|
|
|
|
}
|
|
|
|
|
2013-08-29 04:29:53 +00:00
|
|
|
static int parse_target_str(struct trace *trace)
|
|
|
|
{
|
|
|
|
if (trace->opts.target.pid) {
|
|
|
|
trace->pid_list = intlist__new(trace->opts.target.pid);
|
|
|
|
if (trace->pid_list == NULL) {
|
|
|
|
pr_err("Error parsing process id string\n");
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (trace->opts.target.tid) {
|
|
|
|
trace->tid_list = intlist__new(trace->opts.target.tid);
|
|
|
|
if (trace->tid_list == NULL) {
|
|
|
|
pr_err("Error parsing thread id string\n");
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-09-28 19:13:01 +00:00
|
|
|
static int trace__record(int argc, const char **argv)
|
|
|
|
{
|
|
|
|
unsigned int rec_argc, i, j;
|
|
|
|
const char **rec_argv;
|
|
|
|
const char * const record_args[] = {
|
|
|
|
"record",
|
|
|
|
"-R",
|
|
|
|
"-m", "1024",
|
|
|
|
"-c", "1",
|
|
|
|
"-e", "raw_syscalls:sys_enter,raw_syscalls:sys_exit",
|
|
|
|
};
|
|
|
|
|
|
|
|
rec_argc = ARRAY_SIZE(record_args) + argc;
|
|
|
|
rec_argv = calloc(rec_argc + 1, sizeof(char *));
|
|
|
|
|
|
|
|
if (rec_argv == NULL)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(record_args); i++)
|
|
|
|
rec_argv[i] = record_args[i];
|
|
|
|
|
|
|
|
for (j = 0; j < (unsigned int)argc; j++, i++)
|
|
|
|
rec_argv[i] = argv[j];
|
|
|
|
|
|
|
|
return cmd_record(i, rec_argv, NULL);
|
|
|
|
}
|
|
|
|
|
2012-10-05 05:02:16 +00:00
|
|
|
static int trace__run(struct trace *trace, int argc, const char **argv)
|
2012-09-26 23:05:56 +00:00
|
|
|
{
|
2013-03-11 07:43:12 +00:00
|
|
|
struct perf_evlist *evlist = perf_evlist__new();
|
2012-09-28 20:58:36 +00:00
|
|
|
struct perf_evsel *evsel;
|
2012-10-17 20:09:46 +00:00
|
|
|
int err = -1, i;
|
|
|
|
unsigned long before;
|
2012-10-05 05:02:16 +00:00
|
|
|
const bool forks = argc > 0;
|
2012-09-26 23:05:56 +00:00
|
|
|
|
2013-09-24 14:04:32 +00:00
|
|
|
trace->live = true;
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
if (evlist == NULL) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Not enough memory to run!\n");
|
2012-09-26 23:05:56 +00:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2012-10-03 14:40:22 +00:00
|
|
|
if (perf_evlist__add_newtp(evlist, "raw_syscalls", "sys_enter", trace__sys_enter) ||
|
|
|
|
perf_evlist__add_newtp(evlist, "raw_syscalls", "sys_exit", trace__sys_exit)) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Couldn't read the raw_syscalls tracepoints information!\n");
|
2012-09-26 23:05:56 +00:00
|
|
|
goto out_delete_evlist;
|
|
|
|
}
|
|
|
|
|
2012-10-17 20:13:12 +00:00
|
|
|
if (trace->sched &&
|
|
|
|
perf_evlist__add_newtp(evlist, "sched", "sched_stat_runtime",
|
|
|
|
trace__sched_stat_runtime)) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Couldn't read the sched_stat_runtime tracepoint information!\n");
|
2012-10-17 20:13:12 +00:00
|
|
|
goto out_delete_evlist;
|
|
|
|
}
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
err = perf_evlist__create_maps(evlist, &trace->opts.target);
|
|
|
|
if (err < 0) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Problems parsing the target to trace, check your options!\n");
|
2012-09-26 23:05:56 +00:00
|
|
|
goto out_delete_evlist;
|
|
|
|
}
|
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
err = trace__symbols_init(trace, evlist);
|
|
|
|
if (err < 0) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Problems initializing symbol libraries!\n");
|
2013-03-15 05:48:50 +00:00
|
|
|
goto out_delete_maps;
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
}
|
|
|
|
|
2012-12-10 19:41:31 +00:00
|
|
|
perf_evlist__config(evlist, &trace->opts);
|
2012-09-26 23:05:56 +00:00
|
|
|
|
2012-10-05 05:02:16 +00:00
|
|
|
signal(SIGCHLD, sig_handler);
|
|
|
|
signal(SIGINT, sig_handler);
|
|
|
|
|
|
|
|
if (forks) {
|
2013-03-11 07:43:15 +00:00
|
|
|
err = perf_evlist__prepare_workload(evlist, &trace->opts.target,
|
2013-03-11 07:43:17 +00:00
|
|
|
argv, false, false);
|
2012-10-05 05:02:16 +00:00
|
|
|
if (err < 0) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Couldn't run the workload!\n");
|
2013-03-15 05:48:50 +00:00
|
|
|
goto out_delete_maps;
|
2012-10-05 05:02:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
err = perf_evlist__open(evlist);
|
|
|
|
if (err < 0) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Couldn't create the events: %s\n", strerror(errno));
|
2013-03-15 05:48:50 +00:00
|
|
|
goto out_delete_maps;
|
2012-09-26 23:05:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
err = perf_evlist__mmap(evlist, UINT_MAX, false);
|
|
|
|
if (err < 0) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Couldn't mmap the events: %s\n", strerror(errno));
|
2013-03-15 05:48:50 +00:00
|
|
|
goto out_close_evlist;
|
2012-09-26 23:05:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
perf_evlist__enable(evlist);
|
2012-10-05 05:02:16 +00:00
|
|
|
|
|
|
|
if (forks)
|
|
|
|
perf_evlist__start_workload(evlist);
|
|
|
|
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
trace->multiple_threads = evlist->threads->map[0] == -1 || evlist->threads->nr > 1;
|
2012-09-26 23:05:56 +00:00
|
|
|
again:
|
2012-10-17 20:09:46 +00:00
|
|
|
before = trace->nr_events;
|
2012-09-26 23:05:56 +00:00
|
|
|
|
|
|
|
for (i = 0; i < evlist->nr_mmaps; i++) {
|
|
|
|
union perf_event *event;
|
|
|
|
|
|
|
|
while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
|
|
|
|
const u32 type = event->header.type;
|
2012-09-28 20:58:36 +00:00
|
|
|
tracepoint_handler handler;
|
2012-09-26 23:05:56 +00:00
|
|
|
struct perf_sample sample;
|
|
|
|
|
2012-10-17 20:09:46 +00:00
|
|
|
++trace->nr_events;
|
2012-09-26 23:05:56 +00:00
|
|
|
|
|
|
|
err = perf_evlist__parse_sample(evlist, event, &sample);
|
|
|
|
if (err) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Can't parse sample, err = %d, skipping...\n", err);
|
2012-09-26 23:05:56 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2013-09-04 18:37:43 +00:00
|
|
|
if (!trace->full_time && trace->base_time == 0)
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
trace->base_time = sample.time;
|
|
|
|
|
|
|
|
if (type != PERF_RECORD_SAMPLE) {
|
2013-09-28 19:13:00 +00:00
|
|
|
trace__process_event(trace, trace->host, event);
|
perf trace: Support interrupted syscalls
Using the same strategies as in the tmp.perf/trace2, i.e. the 'trace'
tool implemented by tglx, just updated to the current codebase.
Example:
[root@sandy linux]# perf trace usleep 1 | tail
2.003: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128396288
2.017: mmap(addr: 0, len: 4096, prot: 3, flags: 34, fd: 4294967295, off: 0 ) = -2128400384
2.029: arch_prctl(option: 4098, arg2: 140146949441280, arg3: 140146949435392, arg4: 34, arg5: 4294967295) = 0
2.084: mprotect(start: 208741634048, len: 16384, prot: 1 ) = 0
2.098: mprotect(start: 208735956992, len: 4096, prot: 1 ) = 0
2.122: munmap(addr: 140146949447680, len: 91882 ) = 0
2.359: brk(brk: 0 ) = 28987392
2.371: brk(brk: 29122560 ) = 29122560
2.490: nanosleep(rqtp: 140735694241504, rmtp: 0 ) = 0
2.507: exit_group(error_code: 0
[root@sandy linux]#
For now the timestamp and duration are always on, will be selectable.
Also if multiple threads are being monitored, its tid will appear.
The ret output continues to be interpreted a la strace.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ly9ulroru4my5isn0xe9gr0m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-06 21:43:19 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
evsel = perf_evlist__id2evsel(evlist, sample.id);
|
|
|
|
if (evsel == NULL) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "Unknown tp ID %" PRIu64 ", skipping...\n", sample.id);
|
2012-09-26 23:05:56 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2012-10-20 16:08:46 +00:00
|
|
|
if (sample.raw_data == NULL) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace->output, "%s sample with no payload for tid: %d, cpu %d, raw_size=%d, skipping...\n",
|
2012-10-20 16:08:46 +00:00
|
|
|
perf_evsel__name(evsel), sample.tid,
|
|
|
|
sample.cpu, sample.raw_size);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2012-09-28 20:58:36 +00:00
|
|
|
handler = evsel->handler.func;
|
|
|
|
handler(trace, evsel, &sample);
|
2013-09-03 14:55:07 +00:00
|
|
|
|
|
|
|
if (done)
|
|
|
|
goto out_unmap_evlist;
|
2012-09-26 23:05:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-10-17 20:09:46 +00:00
|
|
|
if (trace->nr_events == before) {
|
2012-10-05 05:02:16 +00:00
|
|
|
if (done)
|
2013-03-15 05:48:50 +00:00
|
|
|
goto out_unmap_evlist;
|
2012-10-05 05:02:16 +00:00
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
poll(evlist->pollfd, evlist->nr_fds, -1);
|
2012-10-05 05:02:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (done)
|
|
|
|
perf_evlist__disable(evlist);
|
2012-09-26 23:05:56 +00:00
|
|
|
|
|
|
|
goto again;
|
|
|
|
|
2013-03-15 05:48:50 +00:00
|
|
|
out_unmap_evlist:
|
|
|
|
perf_evlist__munmap(evlist);
|
|
|
|
out_close_evlist:
|
|
|
|
perf_evlist__close(evlist);
|
|
|
|
out_delete_maps:
|
|
|
|
perf_evlist__delete_maps(evlist);
|
2012-09-26 23:05:56 +00:00
|
|
|
out_delete_evlist:
|
|
|
|
perf_evlist__delete(evlist);
|
|
|
|
out:
|
2013-09-24 14:04:32 +00:00
|
|
|
trace->live = false;
|
2012-09-26 23:05:56 +00:00
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2013-08-29 04:29:52 +00:00
|
|
|
static int trace__replay(struct trace *trace)
|
|
|
|
{
|
|
|
|
const struct perf_evsel_str_handler handlers[] = {
|
|
|
|
{ "raw_syscalls:sys_enter", trace__sys_enter, },
|
|
|
|
{ "raw_syscalls:sys_exit", trace__sys_exit, },
|
|
|
|
};
|
|
|
|
|
|
|
|
struct perf_session *session;
|
|
|
|
int err = -1;
|
|
|
|
|
|
|
|
trace->tool.sample = trace__process_sample;
|
|
|
|
trace->tool.mmap = perf_event__process_mmap;
|
2013-09-23 01:44:58 +00:00
|
|
|
trace->tool.mmap2 = perf_event__process_mmap2;
|
2013-08-29 04:29:52 +00:00
|
|
|
trace->tool.comm = perf_event__process_comm;
|
|
|
|
trace->tool.exit = perf_event__process_exit;
|
|
|
|
trace->tool.fork = perf_event__process_fork;
|
|
|
|
trace->tool.attr = perf_event__process_attr;
|
|
|
|
trace->tool.tracing_data = perf_event__process_tracing_data;
|
|
|
|
trace->tool.build_id = perf_event__process_build_id;
|
|
|
|
|
|
|
|
trace->tool.ordered_samples = true;
|
|
|
|
trace->tool.ordering_requires_timestamps = true;
|
|
|
|
|
|
|
|
/* add tid to output */
|
|
|
|
trace->multiple_threads = true;
|
|
|
|
|
|
|
|
if (symbol__init() < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
session = perf_session__new(input_name, O_RDONLY, 0, false,
|
|
|
|
&trace->tool);
|
|
|
|
if (session == NULL)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
2013-09-28 19:13:00 +00:00
|
|
|
trace->host = &session->machines.host;
|
|
|
|
|
2013-08-29 04:29:52 +00:00
|
|
|
err = perf_session__set_tracepoints_handlers(session, handlers);
|
|
|
|
if (err)
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
if (!perf_session__has_tp(session, "raw_syscalls:sys_enter")) {
|
|
|
|
pr_err("Data file does not have raw_syscalls:sys_enter events\n");
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!perf_session__has_tp(session, "raw_syscalls:sys_exit")) {
|
|
|
|
pr_err("Data file does not have raw_syscalls:sys_exit events\n");
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2013-08-29 04:29:53 +00:00
|
|
|
err = parse_target_str(trace);
|
|
|
|
if (err != 0)
|
|
|
|
goto out;
|
|
|
|
|
2013-08-29 04:29:52 +00:00
|
|
|
setup_pager();
|
|
|
|
|
|
|
|
err = perf_session__process_events(session, &trace->tool);
|
|
|
|
if (err)
|
|
|
|
pr_err("Failed to process events, error %d", err);
|
|
|
|
|
|
|
|
out:
|
|
|
|
perf_session__delete(session);
|
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2012-10-17 20:13:12 +00:00
|
|
|
static size_t trace__fprintf_threads_header(FILE *fp)
|
|
|
|
{
|
|
|
|
size_t printed;
|
|
|
|
|
|
|
|
printed = fprintf(fp, "\n _____________________________________________________________________\n");
|
|
|
|
printed += fprintf(fp," __) Summary of events (__\n\n");
|
|
|
|
printed += fprintf(fp," [ task - pid ] [ events ] [ ratio ] [ runtime ]\n");
|
|
|
|
printed += fprintf(fp," _____________________________________________________________________\n\n");
|
|
|
|
|
|
|
|
return printed;
|
|
|
|
}
|
|
|
|
|
2013-09-28 19:12:59 +00:00
|
|
|
/* struct used to pass data to per-thread function */
|
|
|
|
struct summary_data {
|
|
|
|
FILE *fp;
|
|
|
|
struct trace *trace;
|
|
|
|
size_t printed;
|
|
|
|
};
|
|
|
|
|
|
|
|
static int trace__fprintf_one_thread(struct thread *thread, void *priv)
|
|
|
|
{
|
|
|
|
struct summary_data *data = priv;
|
|
|
|
FILE *fp = data->fp;
|
|
|
|
size_t printed = data->printed;
|
|
|
|
struct trace *trace = data->trace;
|
|
|
|
struct thread_trace *ttrace = thread->priv;
|
|
|
|
const char *color;
|
|
|
|
double ratio;
|
|
|
|
|
|
|
|
if (ttrace == NULL)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
ratio = (double)ttrace->nr_events / trace->nr_events * 100.0;
|
|
|
|
|
|
|
|
color = PERF_COLOR_NORMAL;
|
|
|
|
if (ratio > 50.0)
|
|
|
|
color = PERF_COLOR_RED;
|
|
|
|
else if (ratio > 25.0)
|
|
|
|
color = PERF_COLOR_GREEN;
|
|
|
|
else if (ratio > 5.0)
|
|
|
|
color = PERF_COLOR_YELLOW;
|
|
|
|
|
|
|
|
printed += color_fprintf(fp, color, "%20s", thread->comm);
|
|
|
|
printed += fprintf(fp, " - %-5d :%11lu [", thread->tid, ttrace->nr_events);
|
|
|
|
printed += color_fprintf(fp, color, "%5.1f%%", ratio);
|
|
|
|
printed += fprintf(fp, " ] %10.3f ms\n", ttrace->runtime_ms);
|
|
|
|
|
|
|
|
data->printed += printed;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-17 20:13:12 +00:00
|
|
|
static size_t trace__fprintf_thread_summary(struct trace *trace, FILE *fp)
|
|
|
|
{
|
2013-09-28 19:12:59 +00:00
|
|
|
struct summary_data data = {
|
|
|
|
.fp = fp,
|
|
|
|
.trace = trace
|
|
|
|
};
|
|
|
|
data.printed = trace__fprintf_threads_header(fp);
|
2012-10-17 20:13:12 +00:00
|
|
|
|
2013-09-28 19:12:59 +00:00
|
|
|
machine__for_each_thread(trace->host, trace__fprintf_one_thread, &data);
|
|
|
|
|
|
|
|
return data.printed;
|
2012-10-17 20:13:12 +00:00
|
|
|
}
|
|
|
|
|
perf trace: Add duration filter
Example:
[acme@sandy linux]$ perf trace --duration 0.025 usleep 1
2.221 ( 0.958 ms): 6724 execve(arg0: 140733557168278, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = -2
3.690 ( 1.443 ms): 6724 execve(arg0: 140733557168295, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = 0
3.979 ( 0.048 ms): 6724 open(filename: 208733843841, flags: 0, mode: 1 ) = 3
4.071 ( 0.075 ms): 6724 open(filename: 139744419925673, flags: 0, mode: 0 ) = 3
4.318 ( 0.056 ms): 6724 nanosleep(rqtp: 140734030404608, rmtp: 0 ) = 0
[acme@sandy linux]$ perf trace --duration 0.100 usleep 1
1.143 ( 1.021 ms): 6726 execve(arg0: 140736323962279, arg1: 140736323972752, arg2: 34926752, arg3: 140736323961824, arg4: 7955998171588342573, arg5: 6725) = 0
[acme@sandy linux]$
Cherry picked from tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-oslw2j2958we9qf0ctra4whd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-08 12:56:00 +00:00
|
|
|
static int trace__set_duration(const struct option *opt, const char *str,
|
|
|
|
int unset __maybe_unused)
|
|
|
|
{
|
|
|
|
struct trace *trace = opt->value;
|
|
|
|
|
|
|
|
trace->duration_filter = atof(str);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-08-19 15:01:10 +00:00
|
|
|
static int trace__open_output(struct trace *trace, const char *filename)
|
|
|
|
{
|
|
|
|
struct stat st;
|
|
|
|
|
|
|
|
if (!stat(filename, &st) && st.st_size) {
|
|
|
|
char oldname[PATH_MAX];
|
|
|
|
|
|
|
|
scnprintf(oldname, sizeof(oldname), "%s.old", filename);
|
|
|
|
unlink(oldname);
|
|
|
|
rename(filename, oldname);
|
|
|
|
}
|
|
|
|
|
|
|
|
trace->output = fopen(filename, "w");
|
|
|
|
|
|
|
|
return trace->output == NULL ? -errno : 0;
|
|
|
|
}
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
|
|
|
|
{
|
|
|
|
const char * const trace_usage[] = {
|
2012-10-05 05:02:16 +00:00
|
|
|
"perf trace [<options>] [<command>]",
|
|
|
|
"perf trace [<options>] -- <command> [<options>]",
|
2013-09-28 19:13:01 +00:00
|
|
|
"perf trace record [<options>] [<command>]",
|
|
|
|
"perf trace record [<options>] -- <command> [<options>]",
|
2012-09-26 23:05:56 +00:00
|
|
|
NULL
|
|
|
|
};
|
|
|
|
struct trace trace = {
|
|
|
|
.audit_machine = audit_detect_machine(),
|
|
|
|
.syscalls = {
|
|
|
|
. max = -1,
|
|
|
|
},
|
|
|
|
.opts = {
|
|
|
|
.target = {
|
|
|
|
.uid = UINT_MAX,
|
|
|
|
.uses_mmap = true,
|
|
|
|
},
|
|
|
|
.user_freq = UINT_MAX,
|
|
|
|
.user_interval = ULLONG_MAX,
|
|
|
|
.no_delay = true,
|
|
|
|
.mmap_pages = 1024,
|
|
|
|
},
|
2013-08-19 15:01:10 +00:00
|
|
|
.output = stdout,
|
perf trace: Add option to show process COMM
Enabled by default, disable with --no-comm, e.g.:
181.821 (0.001 ms): deja-dup-monit/10784 recvmsg(fd: 8, msg: 0x7fff4342baf0, flags: PEEK|TRUNC|CMSG_CLOEXEC ) = 20
181.824 (0.001 ms): deja-dup-monit/10784 geteuid( ) = 1000
181.825 (0.001 ms): deja-dup-monit/10784 getegid( ) = 1000
181.834 (0.002 ms): deja-dup-monit/10784 recvmsg(fd: 8, msg: 0x7fff4342baf0, flags: CMSG_CLOEXEC ) = 20
181.836 (0.001 ms): deja-dup-monit/10784 geteuid( ) = 1000
181.838 (0.001 ms): deja-dup-monit/10784 getegid( ) = 1000
181.705 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: PEEK|TRUNC|CMSG_CLOEXEC) = 1256
181.710 (0.002 ms): evolution-addr/10924 geteuid( ) = 1000
181.712 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.727 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: CMSG_CLOEXEC ) = 1256
181.731 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.734 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.908 (0.002 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: PEEK|TRUNC|CMSG_CLOEXEC) = 20
181.913 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.915 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.930 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: CMSG_CLOEXEC ) = 20
181.934 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.937 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
220.718 (0.010 ms): at-spi2-regist/10715 sendmsg(fd: 3, msg: 0x7fffdb8756c0, flags: NOSIGNAL ) = 200
220.741 (0.000 ms): dbus-daemon/10711 ... [continued]: epoll_wait()) = 1
220.759 (0.004 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = 200
220.780 (0.002 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = 200
220.788 (0.001 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = -1 EAGAIN Resource temporarily unavailable
220.760 (0.004 ms): at-spi2-regist/10715 sendmsg(fd: 3, msg: 0x7fffdb8756c0, flags: NOSIGNAL ) = 200
220.771 (0.023 ms): perf/26347 open(filename: 0xf2e780, mode: 15918976 ) = 19
220.850 (0.002 ms): perf/26347 close(fd: 19 ) = 0
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-6be5jvnkdzjptdrebfn5263n@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-12 15:35:21 +00:00
|
|
|
.show_comm = true,
|
2012-09-26 23:05:56 +00:00
|
|
|
};
|
2013-08-19 15:01:10 +00:00
|
|
|
const char *output_name = NULL;
|
2013-08-09 15:28:31 +00:00
|
|
|
const char *ev_qualifier_str = NULL;
|
2012-09-26 23:05:56 +00:00
|
|
|
const struct option trace_options[] = {
|
perf trace: Add option to show process COMM
Enabled by default, disable with --no-comm, e.g.:
181.821 (0.001 ms): deja-dup-monit/10784 recvmsg(fd: 8, msg: 0x7fff4342baf0, flags: PEEK|TRUNC|CMSG_CLOEXEC ) = 20
181.824 (0.001 ms): deja-dup-monit/10784 geteuid( ) = 1000
181.825 (0.001 ms): deja-dup-monit/10784 getegid( ) = 1000
181.834 (0.002 ms): deja-dup-monit/10784 recvmsg(fd: 8, msg: 0x7fff4342baf0, flags: CMSG_CLOEXEC ) = 20
181.836 (0.001 ms): deja-dup-monit/10784 geteuid( ) = 1000
181.838 (0.001 ms): deja-dup-monit/10784 getegid( ) = 1000
181.705 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: PEEK|TRUNC|CMSG_CLOEXEC) = 1256
181.710 (0.002 ms): evolution-addr/10924 geteuid( ) = 1000
181.712 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.727 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: CMSG_CLOEXEC ) = 1256
181.731 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.734 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.908 (0.002 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: PEEK|TRUNC|CMSG_CLOEXEC) = 20
181.913 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.915 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
181.930 (0.003 ms): evolution-addr/10924 recvmsg(fd: 10, msg: 0x7fff17dc6990, flags: CMSG_CLOEXEC ) = 20
181.934 (0.001 ms): evolution-addr/10924 geteuid( ) = 1000
181.937 (0.001 ms): evolution-addr/10924 getegid( ) = 1000
220.718 (0.010 ms): at-spi2-regist/10715 sendmsg(fd: 3, msg: 0x7fffdb8756c0, flags: NOSIGNAL ) = 200
220.741 (0.000 ms): dbus-daemon/10711 ... [continued]: epoll_wait()) = 1
220.759 (0.004 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = 200
220.780 (0.002 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = 200
220.788 (0.001 ms): dbus-daemon/10711 recvmsg(fd: 11, msg: 0x7ffff94594d0, flags: CMSG_CLOEXEC ) = -1 EAGAIN Resource temporarily unavailable
220.760 (0.004 ms): at-spi2-regist/10715 sendmsg(fd: 3, msg: 0x7fffdb8756c0, flags: NOSIGNAL ) = 200
220.771 (0.023 ms): perf/26347 open(filename: 0xf2e780, mode: 15918976 ) = 19
220.850 (0.002 ms): perf/26347 close(fd: 19 ) = 0
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-6be5jvnkdzjptdrebfn5263n@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-12 15:35:21 +00:00
|
|
|
OPT_BOOLEAN(0, "comm", &trace.show_comm,
|
|
|
|
"show the thread COMM next to its id"),
|
2013-08-09 15:28:31 +00:00
|
|
|
OPT_STRING('e', "expr", &ev_qualifier_str, "expr",
|
|
|
|
"list of events to trace"),
|
2013-08-19 15:01:10 +00:00
|
|
|
OPT_STRING('o', "output", &output_name, "file", "output file name"),
|
2013-08-29 04:29:52 +00:00
|
|
|
OPT_STRING('i', "input", &input_name, "file", "Analyze events in file"),
|
2012-09-26 23:05:56 +00:00
|
|
|
OPT_STRING('p', "pid", &trace.opts.target.pid, "pid",
|
|
|
|
"trace events on existing process id"),
|
2013-08-20 17:15:45 +00:00
|
|
|
OPT_STRING('t', "tid", &trace.opts.target.tid, "tid",
|
2012-09-26 23:05:56 +00:00
|
|
|
"trace events on existing thread id"),
|
2013-08-20 17:15:45 +00:00
|
|
|
OPT_BOOLEAN('a', "all-cpus", &trace.opts.target.system_wide,
|
2012-09-26 23:05:56 +00:00
|
|
|
"system-wide collection from all CPUs"),
|
2013-08-20 17:15:45 +00:00
|
|
|
OPT_STRING('C', "cpu", &trace.opts.target.cpu_list, "cpu",
|
2012-09-26 23:05:56 +00:00
|
|
|
"list of cpus to monitor"),
|
2013-08-29 04:29:52 +00:00
|
|
|
OPT_BOOLEAN(0, "no-inherit", &trace.opts.no_inherit,
|
2012-09-26 23:05:56 +00:00
|
|
|
"child tasks do not inherit counters"),
|
2013-09-01 10:36:12 +00:00
|
|
|
OPT_CALLBACK('m', "mmap-pages", &trace.opts.mmap_pages, "pages",
|
|
|
|
"number of mmap data pages",
|
|
|
|
perf_evlist__parse_mmap_pages),
|
2013-08-20 17:15:45 +00:00
|
|
|
OPT_STRING('u', "uid", &trace.opts.target.uid_str, "user",
|
2012-09-26 23:05:56 +00:00
|
|
|
"user to profile"),
|
perf trace: Add duration filter
Example:
[acme@sandy linux]$ perf trace --duration 0.025 usleep 1
2.221 ( 0.958 ms): 6724 execve(arg0: 140733557168278, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = -2
3.690 ( 1.443 ms): 6724 execve(arg0: 140733557168295, arg1: 140733557178768, arg2: 16134304, arg3: 140733557167840, arg4: 7955998171588342573, arg5: 6723) = 0
3.979 ( 0.048 ms): 6724 open(filename: 208733843841, flags: 0, mode: 1 ) = 3
4.071 ( 0.075 ms): 6724 open(filename: 139744419925673, flags: 0, mode: 0 ) = 3
4.318 ( 0.056 ms): 6724 nanosleep(rqtp: 140734030404608, rmtp: 0 ) = 0
[acme@sandy linux]$ perf trace --duration 0.100 usleep 1
1.143 ( 1.021 ms): 6726 execve(arg0: 140736323962279, arg1: 140736323972752, arg2: 34926752, arg3: 140736323961824, arg4: 7955998171588342573, arg5: 6725) = 0
[acme@sandy linux]$
Cherry picked from tmp.perf/trace2 branch.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/n/tip-oslw2j2958we9qf0ctra4whd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-10-08 12:56:00 +00:00
|
|
|
OPT_CALLBACK(0, "duration", &trace, "float",
|
|
|
|
"show only events with duration > N.M ms",
|
|
|
|
trace__set_duration),
|
2012-10-17 20:13:12 +00:00
|
|
|
OPT_BOOLEAN(0, "sched", &trace.sched, "show blocking scheduler events"),
|
2013-08-22 19:49:54 +00:00
|
|
|
OPT_INCR('v', "verbose", &verbose, "be more verbose"),
|
2013-09-04 18:37:43 +00:00
|
|
|
OPT_BOOLEAN('T', "time", &trace.full_time,
|
|
|
|
"Show full timestamp, not time relative to first start"),
|
2012-09-26 23:05:56 +00:00
|
|
|
OPT_END()
|
|
|
|
};
|
|
|
|
int err;
|
2012-10-05 05:02:13 +00:00
|
|
|
char bf[BUFSIZ];
|
2012-09-26 23:05:56 +00:00
|
|
|
|
2013-09-28 19:13:01 +00:00
|
|
|
if ((argc > 1) && (strcmp(argv[1], "record") == 0))
|
|
|
|
return trace__record(argc-2, &argv[2]);
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
argc = parse_options(argc, argv, trace_options, trace_usage, 0);
|
|
|
|
|
2013-08-19 15:01:10 +00:00
|
|
|
if (output_name != NULL) {
|
|
|
|
err = trace__open_output(&trace, output_name);
|
|
|
|
if (err < 0) {
|
|
|
|
perror("failed to create output file");
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-08-09 15:28:31 +00:00
|
|
|
if (ev_qualifier_str != NULL) {
|
2013-08-21 15:56:21 +00:00
|
|
|
const char *s = ev_qualifier_str;
|
|
|
|
|
|
|
|
trace.not_ev_qualifier = *s == '!';
|
|
|
|
if (trace.not_ev_qualifier)
|
|
|
|
++s;
|
|
|
|
trace.ev_qualifier = strlist__new(true, s);
|
2013-08-09 15:28:31 +00:00
|
|
|
if (trace.ev_qualifier == NULL) {
|
2013-08-19 15:01:10 +00:00
|
|
|
fputs("Not enough memory to parse event qualifier",
|
|
|
|
trace.output);
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto out_close;
|
2013-08-09 15:28:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-10-05 05:02:13 +00:00
|
|
|
err = perf_target__validate(&trace.opts.target);
|
|
|
|
if (err) {
|
|
|
|
perf_target__strerror(&trace.opts.target, err, bf, sizeof(bf));
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace.output, "%s", bf);
|
|
|
|
goto out_close;
|
2012-10-05 05:02:13 +00:00
|
|
|
}
|
|
|
|
|
2012-09-26 23:05:56 +00:00
|
|
|
err = perf_target__parse_uid(&trace.opts.target);
|
|
|
|
if (err) {
|
|
|
|
perf_target__strerror(&trace.opts.target, err, bf, sizeof(bf));
|
2013-08-19 15:01:10 +00:00
|
|
|
fprintf(trace.output, "%s", bf);
|
|
|
|
goto out_close;
|
2012-09-26 23:05:56 +00:00
|
|
|
}
|
|
|
|
|
2012-10-05 05:02:16 +00:00
|
|
|
if (!argc && perf_target__none(&trace.opts.target))
|
2012-10-05 05:02:14 +00:00
|
|
|
trace.opts.target.system_wide = true;
|
|
|
|
|
2013-08-29 04:29:52 +00:00
|
|
|
if (input_name)
|
|
|
|
err = trace__replay(&trace);
|
|
|
|
else
|
|
|
|
err = trace__run(&trace, argc, argv);
|
2012-10-17 20:13:12 +00:00
|
|
|
|
|
|
|
if (trace.sched && !err)
|
2013-08-19 15:01:10 +00:00
|
|
|
trace__fprintf_thread_summary(&trace, trace.output);
|
2012-10-17 20:13:12 +00:00
|
|
|
|
2013-08-19 15:01:10 +00:00
|
|
|
out_close:
|
|
|
|
if (output_name != NULL)
|
|
|
|
fclose(trace.output);
|
|
|
|
out:
|
2012-10-17 20:13:12 +00:00
|
|
|
return err;
|
2012-09-26 23:05:56 +00:00
|
|
|
}
|