2013-06-11 19:29:18 +04:00
# include <traceevent/event-parse.h>
2012-09-27 03:05:56 +04: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-07 01:43:19 +04:00
# include "util/color.h"
2013-08-22 23:49:54 +04:00
# include "util/debug.h"
2012-09-27 03:05:56 +04: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-07 01:43:19 +04:00
# include "util/machine.h"
2013-08-29 08:29:52 +04: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-07 01:43:19 +04:00
# include "util/thread.h"
2012-09-27 03:05:56 +04:00
# include "util/parse-options.h"
2013-08-09 19:28:31 +04:00
# include "util/strlist.h"
2013-08-29 08:29:53 +04:00
# include "util/intlist.h"
2012-09-27 03:05:56 +04:00
# include "util/thread_map.h"
2013-10-09 07:26:53 +04:00
# include "util/stat.h"
2012-09-27 03:05:56 +04:00
# include <libaudit.h>
# include <stdlib.h>
2013-09-12 19:18:56 +04: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-21 00:44:42 +04:00
# include <sys/mman.h>
2013-09-02 20:46:44 +04:00
# include <linux/futex.h>
2012-09-27 03:05:56 +04:00
2013-09-12 17:29:00 +04: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
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
struct tp_field {
int offset ;
union {
u64 ( * integer ) ( struct tp_field * field , struct perf_sample * sample ) ;
void * ( * pointer ) ( struct tp_field * field , struct perf_sample * sample ) ;
} ;
} ;
# define TP_UINT_FIELD(bits) \
static u64 tp_field__u # # bits ( struct tp_field * field , struct perf_sample * sample ) \
{ \
return * ( u # # bits * ) ( sample - > raw_data + field - > offset ) ; \
}
TP_UINT_FIELD ( 8 ) ;
TP_UINT_FIELD ( 16 ) ;
TP_UINT_FIELD ( 32 ) ;
TP_UINT_FIELD ( 64 ) ;
# define TP_UINT_FIELD__SWAPPED(bits) \
static u64 tp_field__swapped_u # # bits ( struct tp_field * field , struct perf_sample * sample ) \
{ \
u # # bits value = * ( u # # bits * ) ( sample - > raw_data + field - > offset ) ; \
return bswap_ # # bits ( value ) ; \
}
TP_UINT_FIELD__SWAPPED ( 16 ) ;
TP_UINT_FIELD__SWAPPED ( 32 ) ;
TP_UINT_FIELD__SWAPPED ( 64 ) ;
static int tp_field__init_uint ( struct tp_field * field ,
struct format_field * format_field ,
bool needs_swap )
{
field - > offset = format_field - > offset ;
switch ( format_field - > size ) {
case 1 :
field - > integer = tp_field__u8 ;
break ;
case 2 :
field - > integer = needs_swap ? tp_field__swapped_u16 : tp_field__u16 ;
break ;
case 4 :
field - > integer = needs_swap ? tp_field__swapped_u32 : tp_field__u32 ;
break ;
case 8 :
field - > integer = needs_swap ? tp_field__swapped_u64 : tp_field__u64 ;
break ;
default :
return - 1 ;
}
return 0 ;
}
static void * tp_field__ptr ( struct tp_field * field , struct perf_sample * sample )
{
return sample - > raw_data + field - > offset ;
}
static int tp_field__init_ptr ( struct tp_field * field , struct format_field * format_field )
{
field - > offset = format_field - > offset ;
field - > pointer = tp_field__ptr ;
return 0 ;
}
struct syscall_tp {
struct tp_field id ;
union {
struct tp_field args , ret ;
} ;
} ;
static int perf_evsel__init_tp_uint_field ( struct perf_evsel * evsel ,
struct tp_field * field ,
const char * name )
{
struct format_field * format_field = perf_evsel__field ( evsel , name ) ;
if ( format_field = = NULL )
return - 1 ;
return tp_field__init_uint ( field , format_field , evsel - > needs_swap ) ;
}
# define perf_evsel__init_sc_tp_uint_field(evsel, name) \
( { struct syscall_tp * sc = evsel - > priv ; \
perf_evsel__init_tp_uint_field ( evsel , & sc - > name , # name ) ; } )
static int perf_evsel__init_tp_ptr_field ( struct perf_evsel * evsel ,
struct tp_field * field ,
const char * name )
{
struct format_field * format_field = perf_evsel__field ( evsel , name ) ;
if ( format_field = = NULL )
return - 1 ;
return tp_field__init_ptr ( field , format_field ) ;
}
# define perf_evsel__init_sc_tp_ptr_field(evsel, name) \
( { struct syscall_tp * sc = evsel - > priv ; \
perf_evsel__init_tp_ptr_field ( evsel , & sc - > name , # name ) ; } )
static void perf_evsel__delete_priv ( struct perf_evsel * evsel )
{
free ( evsel - > priv ) ;
evsel - > priv = NULL ;
perf_evsel__delete ( evsel ) ;
}
2013-11-12 15:51:45 +04:00
static int perf_evsel__init_syscall_tp ( struct perf_evsel * evsel , void * handler )
{
evsel - > priv = malloc ( sizeof ( struct syscall_tp ) ) ;
if ( evsel - > priv ! = NULL ) {
if ( perf_evsel__init_sc_tp_uint_field ( evsel , id ) )
goto out_delete ;
evsel - > handler = handler ;
return 0 ;
}
return - ENOMEM ;
out_delete :
free ( evsel - > priv ) ;
evsel - > priv = NULL ;
return - ENOENT ;
}
2013-11-07 23:41:19 +04:00
static struct perf_evsel * perf_evsel__syscall_newtp ( const char * direction , void * handler )
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
{
2013-11-07 23:41:19 +04:00
struct perf_evsel * evsel = perf_evsel__newtp ( " raw_syscalls " , direction ) ;
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
if ( evsel ) {
2013-11-12 15:51:45 +04:00
if ( perf_evsel__init_syscall_tp ( evsel , handler ) )
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
goto out_delete ;
}
return evsel ;
out_delete :
perf_evsel__delete_priv ( evsel ) ;
return NULL ;
}
# define perf_evsel__sc_tp_uint(evsel, name, sample) \
( { struct syscall_tp * fields = evsel - > priv ; \
fields - > name . integer ( & fields - > name , sample ) ; } )
# define perf_evsel__sc_tp_ptr(evsel, name, sample) \
( { struct syscall_tp * fields = evsel - > priv ; \
fields - > name . pointer ( & fields - > name , sample ) ; } )
static int perf_evlist__add_syscall_newtp ( struct perf_evlist * evlist ,
void * sys_enter_handler ,
void * sys_exit_handler )
{
int ret = - 1 ;
struct perf_evsel * sys_enter , * sys_exit ;
2013-11-07 23:41:19 +04:00
sys_enter = perf_evsel__syscall_newtp ( " sys_enter " , sys_enter_handler ) ;
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
if ( sys_enter = = NULL )
goto out ;
if ( perf_evsel__init_sc_tp_ptr_field ( sys_enter , args ) )
goto out_delete_sys_enter ;
2013-11-07 23:41:19 +04:00
sys_exit = perf_evsel__syscall_newtp ( " sys_exit " , sys_exit_handler ) ;
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
if ( sys_exit = = NULL )
goto out_delete_sys_enter ;
if ( perf_evsel__init_sc_tp_uint_field ( sys_exit , ret ) )
goto out_delete_sys_exit ;
perf_evlist__add ( evlist , sys_enter ) ;
perf_evlist__add ( evlist , sys_exit ) ;
ret = 0 ;
out :
return ret ;
out_delete_sys_exit :
perf_evsel__delete_priv ( sys_exit ) ;
out_delete_sys_enter :
perf_evsel__delete_priv ( sys_enter ) ;
goto out ;
}
2013-09-03 19:20:12 +04:00
struct syscall_arg {
unsigned long val ;
2013-09-24 18:04:32 +04:00
struct thread * thread ;
struct trace * trace ;
2013-09-03 22:50:28 +04:00
void * parm ;
2013-09-03 19:20:12 +04:00
u8 idx ;
u8 mask ;
} ;
2013-09-03 22:50:28 +04:00
struct strarray {
2013-10-08 23:00:21 +04:00
int offset ;
2013-09-03 22:50:28 +04: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 23:00:21 +04:00
# define DEFINE_STRARRAY_OFFSET(array, off) struct strarray strarray__##array = { \
. offset = off , \
. nr_entries = ARRAY_SIZE ( array ) , \
. entries = array , \
}
2013-10-09 00:17:43 +04:00
static size_t __syscall_arg__scnprintf_strarray ( char * bf , size_t size ,
const char * intfmt ,
struct syscall_arg * arg )
2013-09-03 22:50:28 +04:00
{
struct strarray * sa = arg - > parm ;
2013-10-08 23:00:21 +04:00
int idx = arg - > val - sa - > offset ;
2013-09-03 22:50:28 +04:00
if ( idx < 0 | | idx > = sa - > nr_entries )
2013-10-09 00:17:43 +04:00
return scnprintf ( bf , size , intfmt , arg - > val ) ;
2013-09-03 22:50:28 +04:00
return scnprintf ( bf , size , " %s " , sa - > entries [ idx ] ) ;
}
2013-10-09 00:17:43 +04: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 22:50:28 +04: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-09 00:43:20 +04: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 18:04:32 +04: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 17:39:21 +04:00
static size_t syscall_arg__scnprintf_hex ( char * bf , size_t size ,
2013-09-03 19:20:12 +04:00
struct syscall_arg * arg )
2013-08-24 01:14:48 +04:00
{
2013-09-03 19:20:12 +04:00
return scnprintf ( bf , size , " %#lx " , arg - > val ) ;
2013-08-24 01:14:48 +04:00
}
2013-08-26 19:29:38 +04:00
# define SCA_HEX syscall_arg__scnprintf_hex
2013-09-02 17:39:21 +04:00
static size_t syscall_arg__scnprintf_mmap_prot ( char * bf , size_t size ,
2013-09-03 19:20:12 +04: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-21 00:44:42 +04:00
{
2013-09-03 19:20:12 +04: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-21 00:44:42 +04: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 17:39:21 +04:00
static size_t syscall_arg__scnprintf_mmap_flags ( char * bf , size_t size ,
2013-09-03 19:20:12 +04: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 17:48:33 +04:00
{
2013-09-03 19:20:12 +04: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 17:48:33 +04: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 18:29:47 +04: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 17:48:33 +04:00
P_MMAP_FLAG ( 32 BIT ) ;
2013-09-05 18:29:47 +04: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 17:48:33 +04: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 20:50:40 +04: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 17:48:33 +04:00
P_MMAP_FLAG ( HUGETLB ) ;
2013-08-27 20:50:40 +04: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 17:48:33 +04: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 17:39:21 +04:00
static size_t syscall_arg__scnprintf_madvise_behavior ( char * bf , size_t size ,
2013-09-03 19:20:12 +04:00
struct syscall_arg * arg )
2013-08-23 17:06:41 +04:00
{
2013-09-03 19:20:12 +04:00
int behavior = arg - > val ;
2013-08-23 17:06:41 +04: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 20:50:40 +04:00
# ifdef MADV_HUGEPAGE
2013-08-23 17:06:41 +04:00
P_MADV_BHV ( HUGEPAGE ) ;
2013-08-27 20:50:40 +04:00
# endif
# ifdef MADV_NOHUGEPAGE
2013-08-23 17:06:41 +04:00
P_MADV_BHV ( NOHUGEPAGE ) ;
2013-08-27 20:50:40 +04:00
# endif
2013-08-23 17:06:41 +04: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 18:49:50 +04: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 19:20:12 +04:00
static size_t syscall_arg__scnprintf_futex_op ( char * bf , size_t size , struct syscall_arg * arg )
2013-09-02 20:46:44 +04: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 19:20:12 +04:00
int op = arg - > val ;
2013-09-02 20:46:44 +04: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 19:20:12 +04: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 20:46:44 +04:00
P_FUTEX_OP ( WAKE_OP ) ; break ;
2013-09-03 19:20:12 +04: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 20:46:44 +04: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 23:15:12 +04:00
# define SCA_FUTEX_OP syscall_arg__scnprintf_futex_op
2013-10-08 23:00:21 +04: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 18:27:32 +04:00
2013-09-03 22:50:28 +04:00
static const char * itimers [ ] = { " REAL " , " VIRTUAL " , " PROF " , } ;
static DEFINE_STRARRAY ( itimers ) ;
2013-09-03 23:15:12 +04: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 20:46:44 +04:00
2013-09-03 23:28:58 +04: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 18:52:33 +04: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 23:37:46 +04:00
static const char * sighow [ ] = { " BLOCK " , " UNBLOCK " , " SETMASK " , } ;
static DEFINE_STRARRAY ( sighow ) ;
2013-09-23 05:45:00 +04: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 17:27:41 +04: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 18:00:44 +04: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 18:54:48 +04:00
# ifndef MSG_PROBE
# define MSG_PROBE 0x10
# endif
2013-09-23 05:44:56 +04: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 18:54:48 +04: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 18:42:27 +04: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 23:22:31 +04:00
static size_t syscall_arg__scnprintf_open_flags ( char * bf , size_t size ,
2013-09-03 19:20:12 +04:00
struct syscall_arg * arg )
2013-09-02 23:22:31 +04:00
{
2013-09-03 19:20:12 +04:00
int printed = 0 , flags = arg - > val ;
2013-09-02 23:22:31 +04:00
if ( ! ( flags & O_CREAT ) )
2013-09-03 19:20:12 +04:00
arg - > mask | = 1 < < ( arg - > idx + 1 ) ; /* Mask the mode parm */
2013-09-02 23:22:31 +04: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 19:18:56 +04: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 19:52:04 +04: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-04 00:17:15 +04: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-09 00:43:20 +04: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 19:13:37 +04:00
# define STRARRAY(arg, name, array) \
. arg_scnprintf = { [ arg ] = SCA_STRARRAY , } , \
. arg_parm = { [ arg ] = & strarray__ # # array , }
2012-09-27 03:05:56 +04:00
static struct syscall_fmt {
const char * name ;
2012-09-27 20:16:00 +04:00
const char * alias ;
2013-09-03 19:20:12 +04:00
size_t ( * arg_scnprintf [ 6 ] ) ( char * bf , size_t size , struct syscall_arg * arg ) ;
2013-09-03 22:50:28 +04:00
void * arg_parm [ 6 ] ;
2012-09-27 03:05:56 +04:00
bool errmsg ;
bool timeout ;
2013-08-26 18:36:30 +04:00
bool hexret ;
2012-09-27 03:05:56 +04:00
} syscall_fmts [ ] = {
2013-09-04 18:42:27 +04:00
{ . name = " access " , . errmsg = true ,
. arg_scnprintf = { [ 1 ] = SCA_ACCMODE , /* mode */ } , } ,
2012-09-27 20:16:00 +04:00
{ . name = " arch_prctl " , . errmsg = true , . alias = " prctl " , } ,
2013-08-26 19:29:38 +04:00
{ . name = " brk " , . hexret = true ,
. arg_scnprintf = { [ 0 ] = SCA_HEX , /* brk */ } , } ,
2013-09-23 05:45:00 +04:00
{ . name = " clock_gettime " , . errmsg = true , STRARRAY ( 0 , clk_id , clockid ) , } ,
2013-09-24 18:04:32 +04:00
{ . name = " close " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_CLOSE_FD , /* fd */ } , } ,
2013-07-30 23:38:23 +04:00
{ . name = " connect " , . errmsg = true , } ,
2013-09-24 18:04:32 +04: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 19:13:37 +04:00
{ . name = " epoll_ctl " , . errmsg = true , STRARRAY ( 1 , op , epoll_ctl_ops ) , } ,
2013-09-12 19:18:56 +04:00
{ . name = " eventfd2 " , . errmsg = true ,
. arg_scnprintf = { [ 1 ] = SCA_EFD_FLAGS , /* flags */ } , } ,
2013-09-24 18:04:32 +04: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 18:49:50 +04:00
{ . name = " flock " , . errmsg = true ,
2013-09-24 18:04:32 +04: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 20:46:44 +04:00
{ . name = " futex " , . errmsg = true ,
. arg_scnprintf = { [ 1 ] = SCA_FUTEX_OP , /* op */ } , } ,
2013-09-24 18:04:32 +04: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 19:13:37 +04:00
{ . name = " getitimer " , . errmsg = true , STRARRAY ( 0 , which , itimers ) , } ,
{ . name = " getrlimit " , . errmsg = true , STRARRAY ( 0 , resource , rlimit_resources ) , } ,
2013-08-26 19:29:38 +04:00
{ . name = " ioctl " , . errmsg = true ,
2013-09-24 18:04:32 +04: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-09 00:43:20 +04:00
[ 1 ] = SCA_STRHEXARRAY , /* cmd */
[ 2 ] = SCA_HEX , /* arg */ } ,
. arg_parm = { [ 1 ] = & strarray__tioctls , /* cmd */ } , } ,
2013-09-04 00:17:15 +04:00
{ . name = " kill " , . errmsg = true ,
. arg_scnprintf = { [ 1 ] = SCA_SIGNUM , /* sig */ } , } ,
2013-09-24 18:04:32 +04: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 19:21:41 +04:00
{ . name = " lstat " , . errmsg = true , . alias = " newlstat " , } ,
2013-08-23 17:06:41 +04:00
{ . name = " madvise " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_HEX , /* start */
[ 2 ] = SCA_MADV_BHV , /* behavior */ } , } ,
2013-09-24 18:04:32 +04:00
{ . name = " mkdirat " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_FDAT , /* fd */ } , } ,
{ . name = " mknodat " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_FDAT , /* fd */ } , } ,
2013-09-24 07:09:38 +04:00
{ . name = " mlock " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_HEX , /* addr */ } , } ,
{ . name = " mlockall " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_HEX , /* addr */ } , } ,
2013-08-26 19:29:38 +04: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-21 00:44:42 +04: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 17:48:33 +04:00
[ 2 ] = SCA_MMAP_PROT , /* prot */
2013-11-12 10:24:59 +04:00
[ 3 ] = SCA_MMAP_FLAGS , /* flags */
[ 4 ] = SCA_FD , /* fd */ } , } ,
2013-08-26 19:29:38 +04: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-21 00:44:42 +04: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 07:09:38 +04:00
{ . name = " munlock " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_HEX , /* addr */ } , } ,
2013-08-26 19:29:38 +04:00
{ . name = " munmap " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_HEX , /* addr */ } , } ,
2013-09-24 18:04:32 +04: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 23:22:31 +04:00
{ . name = " open " , . errmsg = true ,
. arg_scnprintf = { [ 1 ] = SCA_OPEN_FLAGS , /* flags */ } , } ,
2013-09-02 23:40:40 +04:00
{ . name = " open_by_handle_at " , . errmsg = true ,
2013-09-24 18:04:32 +04:00
. arg_scnprintf = { [ 0 ] = SCA_FDAT , /* dfd */
[ 2 ] = SCA_OPEN_FLAGS , /* flags */ } , } ,
2013-09-02 23:40:40 +04:00
{ . name = " openat " , . errmsg = true ,
2013-09-24 18:04:32 +04:00
. arg_scnprintf = { [ 0 ] = SCA_FDAT , /* dfd */
[ 2 ] = SCA_OPEN_FLAGS , /* flags */ } , } ,
2013-09-23 19:52:04 +04:00
{ . name = " pipe2 " , . errmsg = true ,
. arg_scnprintf = { [ 1 ] = SCA_PIPE_FLAGS , /* flags */ } , } ,
2012-09-27 20:16:00 +04:00
{ . name = " poll " , . errmsg = true , . timeout = true , } ,
{ . name = " ppoll " , . errmsg = true , . timeout = true , } ,
2013-09-24 18:04:32 +04: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 19:13:37 +04:00
{ . name = " prlimit64 " , . errmsg = true , STRARRAY ( 1 , resource , rlimit_resources ) , } ,
2013-09-24 18:04:32 +04: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 18:54:48 +04: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 18:04:32 +04:00
{ . name = " renameat " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_FDAT , /* dfd */ } , } ,
2013-09-04 00:17:15 +04:00
{ . name = " rt_sigaction " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_SIGNUM , /* sig */ } , } ,
2013-09-20 19:13:37 +04:00
{ . name = " rt_sigprocmask " , . errmsg = true , STRARRAY ( 0 , how , sighow ) , } ,
2013-09-04 00:17:15 +04: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 20:16:00 +04: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 18:54:48 +04: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 19:13:37 +04:00
{ . name = " setitimer " , . errmsg = true , STRARRAY ( 0 , which , itimers ) , } ,
{ . name = " setrlimit " , . errmsg = true , STRARRAY ( 0 , resource , rlimit_resources ) , } ,
2013-09-24 18:04:32 +04:00
{ . name = " shutdown " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_FD , /* fd */ } , } ,
2013-09-04 17:27:41 +04:00
{ . name = " socket " , . errmsg = true ,
2013-09-04 18:00:44 +04:00
. arg_scnprintf = { [ 0 ] = SCA_STRARRAY , /* family */
[ 1 ] = SCA_SK_TYPE , /* type */ } ,
2013-09-20 19:24:20 +04: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 17:27:41 +04:00
. arg_parm = { [ 0 ] = & strarray__socket_families , /* family */ } , } ,
2012-09-27 20:16:00 +04:00
{ . name = " stat " , . errmsg = true , . alias = " newstat " , } ,
2013-09-24 18:04:32 +04:00
{ . name = " symlinkat " , . errmsg = true ,
. arg_scnprintf = { [ 0 ] = SCA_FDAT , /* dfd */ } , } ,
2013-09-04 00:17:15 +04:00
{ . name = " tgkill " , . errmsg = true ,
. arg_scnprintf = { [ 2 ] = SCA_SIGNUM , /* sig */ } , } ,
{ . name = " tkill " , . errmsg = true ,
. arg_scnprintf = { [ 1 ] = SCA_SIGNUM , /* sig */ } , } ,
2013-08-26 19:21:41 +04:00
{ . name = " uname " , . errmsg = true , . alias = " newuname " , } ,
2013-09-24 18:04:32 +04: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-27 03:05:56 +04: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 19:28:31 +04:00
bool filtered ;
2012-09-27 03:05:56 +04:00
struct syscall_fmt * fmt ;
2013-09-03 19:20:12 +04:00
size_t ( * * arg_scnprintf ) ( char * bf , size_t size , struct syscall_arg * arg ) ;
2013-09-03 22:50:28 +04:00
void * * arg_parm ;
2012-09-27 03:05:56 +04: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 23:24:47 +04: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 19:01:10 +04: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 23:24:47 +04: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-07 01:43:19 +04:00
struct thread_trace {
u64 entry_time ;
u64 exit_time ;
bool entry_pending ;
2012-10-18 00:09:46 +04: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-07 01:43:19 +04:00
char * entry_str ;
2012-10-18 00:13:12 +04:00
double runtime_ms ;
2013-09-24 18:04:32 +04:00
struct {
int max ;
char * * table ;
} paths ;
2013-10-09 07:26:53 +04:00
struct intlist * syscall_stats ;
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-07 01:43:19 +04:00
} ;
static struct thread_trace * thread_trace__new ( void )
{
2013-09-24 18:04:32 +04:00
struct thread_trace * ttrace = zalloc ( sizeof ( struct thread_trace ) ) ;
if ( ttrace )
ttrace - > paths . max = - 1 ;
2013-10-09 07:26:53 +04:00
ttrace - > syscall_stats = intlist__new ( NULL ) ;
2013-09-24 18:04:32 +04:00
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-07 01:43:19 +04:00
}
2013-08-19 19:01:10 +04: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-07 01:43:19 +04:00
{
2012-10-18 00:09:46 +04: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-07 01:43:19 +04:00
if ( thread = = NULL )
goto fail ;
if ( thread - > priv = = NULL )
thread - > priv = thread_trace__new ( ) ;
2012-10-18 00:09:46 +04: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-07 01:43:19 +04:00
if ( thread - > priv = = NULL )
goto fail ;
2012-10-18 00:09:46 +04: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-07 01:43:19 +04:00
fail :
2013-08-19 19:01:10 +04: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-07 01:43:19 +04:00
" WARNING: not enough memory, dropping samples! \n " ) ;
return NULL ;
}
2012-09-27 03:05:56 +04:00
struct trace {
2013-08-19 19:01:10 +04:00
struct perf_tool tool ;
2013-09-28 01:06:19 +04:00
struct {
int machine ;
int open_id ;
} audit ;
2012-09-27 03:05:56 +04:00
struct {
int max ;
struct syscall * table ;
} syscalls ;
struct perf_record_opts opts ;
2013-09-28 23:13:00 +04: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-07 01:43:19 +04:00
u64 base_time ;
2013-09-04 22:37:43 +04:00
bool full_time ;
2013-08-19 19:01:10 +04:00
FILE * output ;
2012-10-18 00:09:46 +04:00
unsigned long nr_events ;
2013-08-21 19:56:21 +04:00
struct strlist * ev_qualifier ;
bool not_ev_qualifier ;
2013-09-24 18:04:32 +04:00
bool live ;
2013-09-28 01:06:19 +04:00
const char * last_vfs_getname ;
2013-08-29 08:29:53 +04:00
struct intlist * tid_list ;
struct intlist * pid_list ;
2012-10-18 00:13:12 +04: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-07 01:43:19 +04:00
bool multiple_threads ;
2013-10-09 07:26:53 +04:00
bool summary ;
2013-11-12 20:31:15 +04:00
bool summary_only ;
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 19:35:21 +04:00
bool show_comm ;
2013-09-28 01:06:19 +04:00
bool show_tool_stats ;
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 16:56:00 +04:00
double duration_filter ;
2012-10-18 00:13:12 +04:00
double runtime_ms ;
2013-09-28 01:06:19 +04:00
struct {
u64 vfs_getname , proc_getname ;
} stats ;
2012-09-27 03:05:56 +04:00
} ;
2013-09-28 00:34:10 +04:00
static int trace__set_fd_pathname ( struct thread * thread , int fd , const char * pathname )
2013-09-24 18:04:32 +04:00
{
struct thread_trace * ttrace = thread - > priv ;
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 ;
}
2013-09-28 00:34:10 +04:00
static int thread__read_fd_path ( struct thread * thread , int fd )
{
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 ' ;
return trace__set_fd_pathname ( thread , fd , pathname ) ;
}
2013-09-28 01:06:19 +04:00
static const char * thread__fd_path ( struct thread * thread , int fd ,
struct trace * trace )
2013-09-24 18:04:32 +04:00
{
struct thread_trace * ttrace = thread - > priv ;
if ( ttrace = = NULL )
return NULL ;
if ( fd < 0 )
return NULL ;
2013-09-28 01:06:19 +04:00
if ( ( fd > ttrace - > paths . max | | ttrace - > paths . table [ fd ] = = NULL ) )
if ( ! trace - > live )
return NULL ;
+ + trace - > stats . proc_getname ;
if ( thread__read_fd_path ( thread , fd ) ) {
return NULL ;
}
2013-09-24 18:04:32 +04:00
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 ) ;
2013-09-28 01:06:19 +04:00
const char * path = thread__fd_path ( arg - > thread , fd , arg - > trace ) ;
2013-09-24 18:04:32 +04:00
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 16:56:00 +04: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-07 01:43:19 +04: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 23:24:47 +04: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-07 01:43:19 +04:00
}
2012-10-05 09:02:16 +04:00
static bool done = false ;
2013-10-16 18:57:33 +04:00
static bool interrupted = false ;
2012-10-05 09:02:16 +04:00
2013-10-16 18:57:33 +04:00
static void sig_handler ( int sig )
2012-10-05 09:02:16 +04:00
{
done = true ;
2013-10-16 18:57:33 +04:00
interrupted = sig = = SIGINT ;
2012-10-05 09:02:16 +04: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-07 01:43:19 +04: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 23:24:47 +04: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-07 01:43:19 +04: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 23:24:47 +04: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-07 01:43:19 +04: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 19:35:21 +04:00
if ( trace - > multiple_threads ) {
if ( trace - > show_comm )
2013-09-11 18:56:44 +04:00
printed + = fprintf ( fp , " %.14s/ " , thread__comm_str ( thread ) ) ;
2013-07-04 17:20:31 +04: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 19:35:21 +04: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-07 01:43:19 +04:00
return printed ;
}
2013-08-19 19:01:10 +04:00
static int trace__process_event ( struct trace * trace , struct machine * machine ,
2013-09-11 18:18:24 +04:00
union perf_event * event , 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-07 01:43:19 +04:00
{
int ret = 0 ;
switch ( event - > header . type ) {
case PERF_RECORD_LOST :
2013-08-19 19:01:10 +04: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-07 01:43:19 +04:00
" LOST % " PRIu64 " events! \n " , event - > lost . lost ) ;
2013-09-11 18:18:24 +04:00
ret = machine__process_lost_event ( machine , event , 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-07 01:43:19 +04:00
default :
2013-09-11 18:18:24 +04:00
ret = machine__process_event ( machine , event , 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-07 01:43:19 +04:00
break ;
}
return ret ;
}
2013-08-19 19:01:10 +04: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-07 01:43:19 +04:00
union perf_event * event ,
2013-09-11 18:18:24 +04:00
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-07 01:43:19 +04:00
struct machine * machine )
{
2013-08-19 19:01:10 +04:00
struct trace * trace = container_of ( tool , struct trace , tool ) ;
2013-09-11 18:18:24 +04:00
return trace__process_event ( trace , machine , event , 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-07 01:43:19 +04:00
}
static int trace__symbols_init ( struct trace * trace , struct perf_evlist * evlist )
{
int err = symbol__init ( ) ;
if ( err )
return err ;
2013-09-28 23:13:00 +04: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-07 01:43:19 +04:00
2013-11-11 18:36:12 +04:00
err = __machine__synthesize_threads ( trace - > host , & trace - > tool , & trace - > opts . target ,
evlist - > threads , trace__tool_process , false ) ;
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-07 01:43:19 +04:00
if ( err )
symbol__exit ( ) ;
return err ;
}
2013-08-24 01:14:48 +04: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 22:50:28 +04:00
if ( sc - > fmt )
sc - > arg_parm = sc - > fmt - > arg_parm ;
2013-08-24 01:14:48 +04:00
for ( field = sc - > tp_format - > format . fields - > next ; field ; field = field - > next ) {
2013-08-26 19:29:38 +04: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-24 01:14:48 +04:00
sc - > arg_scnprintf [ idx ] = syscall_arg__scnprintf_hex ;
+ + idx ;
}
return 0 ;
}
2012-09-27 03:05:56 +04:00
static int trace__read_syscall_info ( struct trace * trace , int id )
{
char tp_name [ 128 ] ;
struct syscall * sc ;
2013-09-28 01:06:19 +04:00
const char * name = audit_syscall_to_name ( id , trace - > audit . machine ) ;
2012-10-20 19:39:03 +04:00
if ( name = = NULL )
return - 1 ;
2012-09-27 03:05:56 +04: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 19:39:03 +04:00
sc - > name = name ;
2013-08-09 19:28:31 +04:00
2013-08-21 19:56:21 +04: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 19:28:31 +04:00
}
2012-10-20 19:39:03 +04:00
sc - > fmt = syscall_fmt__find ( sc - > name ) ;
2012-09-27 03:05:56 +04:00
2012-09-27 20:16:00 +04:00
snprintf ( tp_name , sizeof ( tp_name ) , " sys_enter_%s " , sc - > name ) ;
2012-09-27 03:05:56 +04:00
sc - > tp_format = event_format__new ( " syscalls " , tp_name ) ;
2012-09-27 20:16:00 +04: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-27 03:05:56 +04:00
2013-08-24 01:14:48 +04:00
if ( sc - > tp_format = = NULL )
return - 1 ;
return syscall__set_arg_fmts ( sc ) ;
2012-09-27 03:05:56 +04: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-07 01:43:19 +04:00
static size_t syscall__scnprintf_args ( struct syscall * sc , char * bf , size_t size ,
2013-09-24 18:04:32 +04:00
unsigned long * args , struct trace * trace ,
struct thread * thread )
2012-09-27 03:05:56 +04:00
{
size_t printed = 0 ;
if ( sc - > tp_format ! = NULL ) {
struct format_field * field ;
2013-09-03 19:20:12 +04:00
u8 bit = 1 ;
struct syscall_arg arg = {
2013-09-24 18:04:32 +04:00
. idx = 0 ,
. mask = 0 ,
. trace = trace ,
. thread = thread ,
2013-09-03 19:20:12 +04:00
} ;
2013-09-02 17:39:21 +04:00
for ( field = sc - > tp_format - > format . fields - > next ; field ;
2013-09-03 19:20:12 +04:00
field = field - > next , + + arg . idx , bit < < = 1 ) {
if ( arg . mask & bit )
2013-09-02 17:39:21 +04:00
continue ;
2013-09-20 19:19:41 +04: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 18:27:34 +04: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-07 01:43:19 +04:00
printed + = scnprintf ( bf + printed , size - printed ,
2013-08-24 01:14:48 +04:00
" %s%s: " , printed ? " , " : " " , field - > name ) ;
2013-09-03 19:20:12 +04:00
if ( sc - > arg_scnprintf & & sc - > arg_scnprintf [ arg . idx ] ) {
arg . val = args [ arg . idx ] ;
2013-09-03 22:50:28 +04:00
if ( sc - > arg_parm )
arg . parm = sc - > arg_parm [ arg . idx ] ;
2013-09-03 19:20:12 +04:00
printed + = sc - > arg_scnprintf [ arg . idx ] ( bf + printed ,
size - printed , & arg ) ;
2013-09-02 17:39:21 +04:00
} else {
2013-08-24 01:14:48 +04:00
printed + = scnprintf ( bf + printed , size - printed ,
2013-09-03 19:20:12 +04:00
" %ld " , args [ arg . idx ] ) ;
2013-09-02 17:39:21 +04:00
}
2012-09-27 03:05:56 +04:00
}
} else {
2013-09-03 19:20:12 +04:00
int i = 0 ;
2012-09-27 03:05:56 +04: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-07 01:43:19 +04:00
printed + = scnprintf ( bf + printed , size - printed ,
" %sarg%d: %ld " ,
printed ? " , " : " " , i , args [ i ] ) ;
2012-09-27 03:05:56 +04:00
+ + i ;
}
}
return printed ;
}
2012-09-29 00:58:36 +04: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 ,
2013-10-09 07:26:53 +04:00
struct perf_evsel * evsel , int id )
2012-09-29 00:58:36 +04:00
{
if ( id < 0 ) {
2013-08-23 00:55:25 +04: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-29 00:58:36 +04: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 23:49:54 +04: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-29 00:58:36 +04:00
return NULL ;
}
2013-10-09 07:26:53 +04:00
static void thread__update_stats ( struct thread_trace * ttrace ,
int id , struct perf_sample * sample )
{
struct int_node * inode ;
struct stats * stats ;
u64 duration = 0 ;
inode = intlist__findnew ( ttrace - > syscall_stats , id ) ;
if ( inode = = NULL )
return ;
stats = inode - > priv ;
if ( stats = = NULL ) {
stats = malloc ( sizeof ( struct stats ) ) ;
if ( stats = = NULL )
return ;
init_stats ( stats ) ;
inode - > priv = stats ;
}
if ( ttrace - > entry_time & & sample - > time > ttrace - > entry_time )
duration = sample - > time - ttrace - > entry_time ;
update_stats ( stats , duration ) ;
}
2012-09-29 00:58:36 +04:00
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-07 01:43:19 +04:00
char * msg ;
2012-09-29 00:58:36 +04: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-07 01:43:19 +04:00
size_t printed = 0 ;
2013-08-09 19:28:31 +04:00
struct thread * thread ;
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
int id = perf_evsel__sc_tp_uint ( evsel , id , sample ) ;
2013-10-09 07:26:53 +04:00
struct syscall * sc = trace__syscall_info ( trace , evsel , id ) ;
2013-08-09 19:28:31 +04:00
struct thread_trace * ttrace ;
if ( sc = = NULL )
return - 1 ;
2012-09-29 00:58:36 +04:00
2013-08-09 19:28:31 +04:00
if ( sc - > filtered )
return 0 ;
2013-09-28 23:13:00 +04:00
thread = machine__findnew_thread ( trace - > host , sample - > pid , sample - > tid ) ;
2013-08-19 19:01:10 +04:00
ttrace = thread__trace ( thread , trace - > output ) ;
2013-08-09 19:28:31 +04:00
if ( ttrace = = NULL )
2012-09-29 00:58:36 +04:00
return - 1 ;
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
args = perf_evsel__sc_tp_ptr ( evsel , args , 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-07 01:43:19 +04: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 18:04:32 +04: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-07 01:43:19 +04:00
if ( ! strcmp ( sc - > name , " exit_group " ) | | ! strcmp ( sc - > name , " exit " ) ) {
2013-11-12 20:31:15 +04:00
if ( ! trace - > duration_filter & & ! trace - > summary_only ) {
2013-08-19 19:01:10 +04: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 16:56:00 +04: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-07 01:43:19 +04:00
} else
ttrace - > entry_pending = true ;
2012-09-29 00:58:36 +04: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 23:24:47 +04:00
u64 duration = 0 ;
2013-08-09 19:28:31 +04:00
struct thread * thread ;
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
int id = perf_evsel__sc_tp_uint ( evsel , id , sample ) ;
2013-10-09 07:26:53 +04:00
struct syscall * sc = trace__syscall_info ( trace , evsel , id ) ;
2013-08-09 19:28:31 +04:00
struct thread_trace * ttrace ;
if ( sc = = NULL )
return - 1 ;
2012-09-29 00:58:36 +04:00
2013-08-09 19:28:31 +04:00
if ( sc - > filtered )
return 0 ;
2013-09-28 23:13:00 +04:00
thread = machine__findnew_thread ( trace - > host , sample - > pid , sample - > tid ) ;
2013-08-19 19:01:10 +04:00
ttrace = thread__trace ( thread , trace - > output ) ;
2013-08-09 19:28:31 +04:00
if ( ttrace = = NULL )
2012-09-29 00:58:36 +04:00
return - 1 ;
2013-10-09 07:26:53 +04:00
if ( trace - > summary )
thread__update_stats ( ttrace , id , sample ) ;
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
ret = perf_evsel__sc_tp_uint ( evsel , ret , sample ) ;
2012-09-29 00:58:36 +04:00
2013-09-28 01:06:19 +04:00
if ( id = = trace - > audit . open_id & & ret > = 0 & & trace - > last_vfs_getname ) {
trace__set_fd_pathname ( thread , ret , trace - > last_vfs_getname ) ;
trace - > last_vfs_getname = NULL ;
+ + trace - > stats . vfs_getname ;
}
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-07 01:43:19 +04: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 16:56:00 +04: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 23:24:47 +04: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 16:56:00 +04: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 23:24:47 +04:00
2013-11-12 20:31:15 +04:00
if ( trace - > summary_only )
goto out ;
2013-08-19 19:01:10 +04: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-07 01:43:19 +04:00
if ( ttrace - > entry_pending ) {
2013-08-19 19:01:10 +04: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-07 01:43:19 +04:00
} else {
2013-08-19 19:01:10 +04: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-07 01:43:19 +04:00
}
2013-08-26 18:28:34 +04:00
if ( sc - > fmt = = NULL ) {
signed_print :
fprintf ( trace - > output , " ) = %d " , ret ) ;
} else if ( ret < 0 & & sc - > fmt - > errmsg ) {
2012-09-29 00:58:36 +04:00
char bf [ 256 ] ;
const char * emsg = strerror_r ( - ret , bf , sizeof ( bf ) ) ,
* e = audit_errno_to_name ( - ret ) ;
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " ) = -1 %s %s " , e , emsg ) ;
2013-08-26 18:28:34 +04:00
} else if ( ret = = 0 & & sc - > fmt - > timeout )
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " ) = 0 Timeout " ) ;
2013-08-26 18:36:30 +04:00
else if ( sc - > fmt - > hexret )
fprintf ( trace - > output , " ) = %#x " , ret ) ;
2012-09-29 00:58:36 +04:00
else
2013-08-26 18:28:34 +04:00
goto signed_print ;
2012-09-29 00:58:36 +04:00
2013-08-19 19:01:10 +04: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 16:56:00 +04: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-07 01:43:19 +04:00
ttrace - > entry_pending = false ;
2012-09-29 00:58:36 +04:00
return 0 ;
}
2013-09-28 01:06:19 +04:00
static int trace__vfs_getname ( struct trace * trace , struct perf_evsel * evsel ,
struct perf_sample * sample )
{
trace - > last_vfs_getname = perf_evsel__rawptr ( evsel , sample , " pathname " ) ;
return 0 ;
}
2012-10-18 00:13:12 +04: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 23:13:00 +04:00
struct thread * thread = machine__findnew_thread ( trace - > host ,
2013-08-27 12:23:03 +04:00
sample - > pid ,
sample - > tid ) ;
2013-08-19 19:01:10 +04:00
struct thread_trace * ttrace = thread__trace ( thread , trace - > output ) ;
2012-10-18 00:13:12 +04:00
if ( ttrace = = NULL )
goto out_dump ;
ttrace - > runtime_ms + = runtime_ms ;
trace - > runtime_ms + = runtime_ms ;
return 0 ;
out_dump :
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " %s: comm=%s,pid=%u,runtime=% " PRIu64 " ,vruntime=% " PRIu64 " ) \n " ,
2012-10-18 00:13:12 +04: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 08:29:53 +04: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 08:29:52 +04: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 ;
2013-11-06 17:17:38 +04:00
tracepoint_handler handler = evsel - > handler ;
2013-08-29 08:29:52 +04:00
2013-08-29 08:29:53 +04:00
if ( skip_sample ( trace , sample ) )
return 0 ;
2013-09-04 22:37:43 +04:00
if ( ! trace - > full_time & & trace - > base_time = = 0 )
2013-08-29 08:29:52 +04:00
trace - > base_time = sample - > time ;
if ( handler )
handler ( trace , evsel , sample ) ;
return err ;
}
2013-08-29 08:29:53 +04: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 23:13:01 +04: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 ) ;
}
2013-10-09 07:26:53 +04:00
static size_t trace__fprintf_thread_summary ( struct trace * trace , FILE * fp ) ;
2013-09-28 01:06:19 +04:00
static void perf_evlist__add_vfs_getname ( struct perf_evlist * evlist )
{
2013-11-07 23:41:19 +04:00
struct perf_evsel * evsel = perf_evsel__newtp ( " probe " , " vfs_getname " ) ;
2013-09-28 01:06:19 +04:00
if ( evsel = = NULL )
return ;
if ( perf_evsel__field ( evsel , " pathname " ) = = NULL ) {
perf_evsel__delete ( evsel ) ;
return ;
}
2013-11-06 17:17:38 +04:00
evsel - > handler = trace__vfs_getname ;
2013-09-28 01:06:19 +04:00
perf_evlist__add ( evlist , evsel ) ;
}
2012-10-05 09:02:16 +04:00
static int trace__run ( struct trace * trace , int argc , const char * * argv )
2012-09-27 03:05:56 +04:00
{
2013-03-11 11:43:12 +04:00
struct perf_evlist * evlist = perf_evlist__new ( ) ;
2012-09-29 00:58:36 +04:00
struct perf_evsel * evsel ;
2012-10-18 00:09:46 +04:00
int err = - 1 , i ;
unsigned long before ;
2012-10-05 09:02:16 +04:00
const bool forks = argc > 0 ;
2012-09-27 03:05:56 +04:00
2013-09-24 18:04:32 +04:00
trace - > live = true ;
2012-09-27 03:05:56 +04:00
if ( evlist = = NULL ) {
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " Not enough memory to run! \n " ) ;
2012-09-27 03:05:56 +04:00
goto out ;
}
perf trace: Don't relookup fields by name in each sample
Instead do the lookups just when creating the tracepoints, initially for
the most common, raw_syscalls:sys_{enter,exit}.
It works by having evsel->priv have a per tracepoint structure with
entries for the fields, for direct access, with the offset and a
function to get the value from the sample, doing the swap if needed.
Using a simple workload that does M millions write syscalls, we go from:
# perf stat -i -e cycles /tmp/oldperf trace ./sc_hello 100 > /dev/null
Performance counter stats for '/tmp/oldperf trace ./sc_hello 100':
8,366,771,459 cycles
2.668025928 seconds time elapsed
# perf stat -i -e cycles perf trace ./sc_hello 100 > /dev/null
Performance counter stats for 'perf trace ./sc_hello 100':
8,345,187,650 cycles
2.631748425 seconds time elapsed
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-eyfhvoo510a5i10b27dnvm88@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-11-06 23:35:57 +04:00
if ( perf_evlist__add_syscall_newtp ( evlist , trace__sys_enter , trace__sys_exit ) )
2013-10-04 09:17:31 +04:00
goto out_error_tp ;
2012-09-27 03:05:56 +04:00
2013-09-28 01:06:19 +04:00
perf_evlist__add_vfs_getname ( evlist ) ;
2012-10-18 00:13:12 +04:00
if ( trace - > sched & &
2013-10-04 09:17:31 +04:00
perf_evlist__add_newtp ( evlist , " sched " , " sched_stat_runtime " ,
trace__sched_stat_runtime ) )
goto out_error_tp ;
2012-10-18 00:13:12 +04:00
2012-09-27 03:05:56 +04:00
err = perf_evlist__create_maps ( evlist , & trace - > opts . target ) ;
if ( err < 0 ) {
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " Problems parsing the target to trace, check your options! \n " ) ;
2012-09-27 03:05:56 +04: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-07 01:43:19 +04:00
err = trace__symbols_init ( trace , evlist ) ;
if ( err < 0 ) {
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " Problems initializing symbol libraries! \n " ) ;
2013-03-15 09:48:50 +04: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-07 01:43:19 +04:00
}
2012-12-10 23:41:31 +04:00
perf_evlist__config ( evlist , & trace - > opts ) ;
2012-09-27 03:05:56 +04:00
2012-10-05 09:02:16 +04:00
signal ( SIGCHLD , sig_handler ) ;
signal ( SIGINT , sig_handler ) ;
if ( forks ) {
2013-03-11 11:43:15 +04:00
err = perf_evlist__prepare_workload ( evlist , & trace - > opts . target ,
2013-03-11 11:43:17 +04:00
argv , false , false ) ;
2012-10-05 09:02:16 +04:00
if ( err < 0 ) {
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " Couldn't run the workload! \n " ) ;
2013-03-15 09:48:50 +04:00
goto out_delete_maps ;
2012-10-05 09:02:16 +04:00
}
}
2012-09-27 03:05:56 +04:00
err = perf_evlist__open ( evlist ) ;
perf trace: Improve messages related to /proc/sys/kernel/perf_event_paranoid
kernel/events/core.c has:
/*
* perf event paranoia level:
* -1 - not paranoid at all
* 0 - disallow raw tracepoint access for unpriv
* 1 - disallow cpu events for unpriv
* 2 - disallow kernel profiling for unpriv
*/
int sysctl_perf_event_paranoid __read_mostly = 1;
So, with the default being 1, a non-root user can trace his stuff:
[acme@zoo ~]$ cat /proc/sys/kernel/perf_event_paranoid
1
[acme@zoo ~]$ yes > /dev/null &
[1] 15338
[acme@zoo ~]$ trace -p 15338 | head -5
0.005 ( 0.005 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.045 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.085 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.125 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.165 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
[acme@zoo ~]$
[acme@zoo ~]$ trace --duration 1 sleep 1
1002.148 (1001.218 ms): nanosleep(rqtp: 0x7fff46c79250 ) = 0
[acme@zoo ~]$
[acme@zoo ~]$ trace -- usleep 1 | tail -5
0.905 ( 0.002 ms): brk( ) = 0x1c82000
0.910 ( 0.003 ms): brk(brk: 0x1ca3000 ) = 0x1ca3000
0.913 ( 0.001 ms): brk( ) = 0x1ca3000
0.990 ( 0.059 ms): nanosleep(rqtp: 0x7fffe31a3280 ) = 0
0.995 ( 0.000 ms): exit_group(
[acme@zoo ~]$
But can't do system wide tracing:
[acme@zoo ~]$ trace
Error: Operation not permitted.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 1.
[acme@zoo ~]$
[acme@zoo ~]$ trace --cpu 0
Error: Operation not permitted.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 1.
[acme@zoo ~]$
If the paranoid level is >= 2, i.e. turn this perf stuff off for !root users:
[acme@zoo ~]$ sudo sh -c 'echo 2 > /proc/sys/kernel/perf_event_paranoid'
[acme@zoo ~]$ cat /proc/sys/kernel/perf_event_paranoid
2
[acme@zoo ~]$
[acme@zoo ~]$ trace usleep 1
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
[acme@zoo ~]$ trace
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
[acme@zoo ~]$ trace --cpu 1
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
If the user manages to get what he/she wants, convincing root not
to be paranoid at all...
[root@zoo ~]# echo -1 > /proc/sys/kernel/perf_event_paranoid
[root@zoo ~]# cat /proc/sys/kernel/perf_event_paranoid
-1
[root@zoo ~]#
[acme@zoo ~]$ ps -eo user,pid,comm | grep Xorg
root 729 Xorg
[acme@zoo ~]$
[acme@zoo ~]$ trace -a --duration 0.001 -e \!select,ioctl,writev | grep Xorg | head -5
23.143 ( 0.003 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
23.152 ( 0.004 ms): Xorg/729 read(fd: 31, buf: 0x2544af0, count: 4096 ) = 8
23.161 ( 0.002 ms): Xorg/729 read(fd: 31, buf: 0x2544af0, count: 4096 ) = -1 EAGAIN Resource temporarily unavailable
23.175 ( 0.002 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
23.235 ( 0.002 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
[acme@zoo ~]$
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-di28olfwd28rvkox7v3hqhu1@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-10-18 00:38:29 +04:00
if ( err < 0 )
goto out_error_open ;
2012-09-27 03:05:56 +04:00
err = perf_evlist__mmap ( evlist , UINT_MAX , false ) ;
if ( err < 0 ) {
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " Couldn't mmap the events: %s \n " , strerror ( errno ) ) ;
2013-03-15 09:48:50 +04:00
goto out_close_evlist ;
2012-09-27 03:05:56 +04:00
}
perf_evlist__enable ( evlist ) ;
2012-10-05 09:02:16 +04: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-07 01:43:19 +04:00
trace - > multiple_threads = evlist - > threads - > map [ 0 ] = = - 1 | | evlist - > threads - > nr > 1 ;
2012-09-27 03:05:56 +04:00
again :
2012-10-18 00:09:46 +04:00
before = trace - > nr_events ;
2012-09-27 03:05:56 +04: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-29 00:58:36 +04:00
tracepoint_handler handler ;
2012-09-27 03:05:56 +04:00
struct perf_sample sample ;
2012-10-18 00:09:46 +04:00
+ + trace - > nr_events ;
2012-09-27 03:05:56 +04:00
err = perf_evlist__parse_sample ( evlist , event , & sample ) ;
if ( err ) {
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " Can't parse sample, err = %d, skipping... \n " , err ) ;
2013-10-24 11:43:33 +04:00
goto next_event ;
2012-09-27 03:05:56 +04:00
}
2013-09-04 22:37:43 +04: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-07 01:43:19 +04:00
trace - > base_time = sample . time ;
if ( type ! = PERF_RECORD_SAMPLE ) {
2013-09-11 18:18:24 +04:00
trace__process_event ( trace , trace - > host , event , & 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-07 01:43:19 +04:00
continue ;
}
2012-09-27 03:05:56 +04:00
evsel = perf_evlist__id2evsel ( evlist , sample . id ) ;
if ( evsel = = NULL ) {
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " Unknown tp ID % " PRIu64 " , skipping... \n " , sample . id ) ;
2013-10-24 11:43:33 +04:00
goto next_event ;
2012-09-27 03:05:56 +04:00
}
2012-10-20 20:08:46 +04:00
if ( sample . raw_data = = NULL ) {
2013-08-19 19:01:10 +04:00
fprintf ( trace - > output , " %s sample with no payload for tid: %d, cpu %d, raw_size=%d, skipping... \n " ,
2012-10-20 20:08:46 +04:00
perf_evsel__name ( evsel ) , sample . tid ,
sample . cpu , sample . raw_size ) ;
2013-10-24 11:43:33 +04:00
goto next_event ;
2012-10-20 20:08:46 +04:00
}
2013-11-06 17:17:38 +04:00
handler = evsel - > handler ;
2012-09-29 00:58:36 +04:00
handler ( trace , evsel , & sample ) ;
2013-10-24 11:43:33 +04:00
next_event :
perf_evlist__mmap_consume ( evlist , i ) ;
2013-09-03 18:55:07 +04:00
2013-10-16 18:57:33 +04:00
if ( interrupted )
goto out_disable ;
2012-09-27 03:05:56 +04:00
}
}
2012-10-18 00:09:46 +04:00
if ( trace - > nr_events = = before ) {
2013-10-16 18:57:33 +04:00
int timeout = done ? 100 : - 1 ;
2012-10-05 09:02:16 +04:00
2013-10-16 18:57:33 +04:00
if ( poll ( evlist - > pollfd , evlist - > nr_fds , timeout ) > 0 )
goto again ;
} else {
goto again ;
2012-10-05 09:02:16 +04:00
}
2013-10-16 18:57:33 +04:00
out_disable :
perf_evlist__disable ( evlist ) ;
2012-09-27 03:05:56 +04:00
2013-09-28 01:06:19 +04:00
if ( ! err ) {
if ( trace - > summary )
trace__fprintf_thread_summary ( trace , trace - > output ) ;
if ( trace - > show_tool_stats ) {
fprintf ( trace - > output , " Stats: \n "
" vfs_getname : % " PRIu64 " \n "
" proc_getname: % " PRIu64 " \n " ,
trace - > stats . vfs_getname ,
trace - > stats . proc_getname ) ;
}
}
2013-10-09 07:26:53 +04:00
2013-03-15 09:48:50 +04:00
perf_evlist__munmap ( evlist ) ;
out_close_evlist :
perf_evlist__close ( evlist ) ;
out_delete_maps :
perf_evlist__delete_maps ( evlist ) ;
2012-09-27 03:05:56 +04:00
out_delete_evlist :
perf_evlist__delete ( evlist ) ;
out :
2013-09-24 18:04:32 +04:00
trace - > live = false ;
2012-09-27 03:05:56 +04:00
return err ;
2013-10-17 19:07:58 +04:00
{
char errbuf [ BUFSIZ ] ;
perf trace: Improve messages related to /proc/sys/kernel/perf_event_paranoid
kernel/events/core.c has:
/*
* perf event paranoia level:
* -1 - not paranoid at all
* 0 - disallow raw tracepoint access for unpriv
* 1 - disallow cpu events for unpriv
* 2 - disallow kernel profiling for unpriv
*/
int sysctl_perf_event_paranoid __read_mostly = 1;
So, with the default being 1, a non-root user can trace his stuff:
[acme@zoo ~]$ cat /proc/sys/kernel/perf_event_paranoid
1
[acme@zoo ~]$ yes > /dev/null &
[1] 15338
[acme@zoo ~]$ trace -p 15338 | head -5
0.005 ( 0.005 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.045 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.085 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.125 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.165 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
[acme@zoo ~]$
[acme@zoo ~]$ trace --duration 1 sleep 1
1002.148 (1001.218 ms): nanosleep(rqtp: 0x7fff46c79250 ) = 0
[acme@zoo ~]$
[acme@zoo ~]$ trace -- usleep 1 | tail -5
0.905 ( 0.002 ms): brk( ) = 0x1c82000
0.910 ( 0.003 ms): brk(brk: 0x1ca3000 ) = 0x1ca3000
0.913 ( 0.001 ms): brk( ) = 0x1ca3000
0.990 ( 0.059 ms): nanosleep(rqtp: 0x7fffe31a3280 ) = 0
0.995 ( 0.000 ms): exit_group(
[acme@zoo ~]$
But can't do system wide tracing:
[acme@zoo ~]$ trace
Error: Operation not permitted.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 1.
[acme@zoo ~]$
[acme@zoo ~]$ trace --cpu 0
Error: Operation not permitted.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 1.
[acme@zoo ~]$
If the paranoid level is >= 2, i.e. turn this perf stuff off for !root users:
[acme@zoo ~]$ sudo sh -c 'echo 2 > /proc/sys/kernel/perf_event_paranoid'
[acme@zoo ~]$ cat /proc/sys/kernel/perf_event_paranoid
2
[acme@zoo ~]$
[acme@zoo ~]$ trace usleep 1
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
[acme@zoo ~]$ trace
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
[acme@zoo ~]$ trace --cpu 1
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
If the user manages to get what he/she wants, convincing root not
to be paranoid at all...
[root@zoo ~]# echo -1 > /proc/sys/kernel/perf_event_paranoid
[root@zoo ~]# cat /proc/sys/kernel/perf_event_paranoid
-1
[root@zoo ~]#
[acme@zoo ~]$ ps -eo user,pid,comm | grep Xorg
root 729 Xorg
[acme@zoo ~]$
[acme@zoo ~]$ trace -a --duration 0.001 -e \!select,ioctl,writev | grep Xorg | head -5
23.143 ( 0.003 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
23.152 ( 0.004 ms): Xorg/729 read(fd: 31, buf: 0x2544af0, count: 4096 ) = 8
23.161 ( 0.002 ms): Xorg/729 read(fd: 31, buf: 0x2544af0, count: 4096 ) = -1 EAGAIN Resource temporarily unavailable
23.175 ( 0.002 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
23.235 ( 0.002 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
[acme@zoo ~]$
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-di28olfwd28rvkox7v3hqhu1@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-10-18 00:38:29 +04:00
out_error_tp :
2013-10-17 19:07:58 +04:00
perf_evlist__strerror_tp ( evlist , errno , errbuf , sizeof ( errbuf ) ) ;
perf trace: Improve messages related to /proc/sys/kernel/perf_event_paranoid
kernel/events/core.c has:
/*
* perf event paranoia level:
* -1 - not paranoid at all
* 0 - disallow raw tracepoint access for unpriv
* 1 - disallow cpu events for unpriv
* 2 - disallow kernel profiling for unpriv
*/
int sysctl_perf_event_paranoid __read_mostly = 1;
So, with the default being 1, a non-root user can trace his stuff:
[acme@zoo ~]$ cat /proc/sys/kernel/perf_event_paranoid
1
[acme@zoo ~]$ yes > /dev/null &
[1] 15338
[acme@zoo ~]$ trace -p 15338 | head -5
0.005 ( 0.005 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.045 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.085 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.125 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.165 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
[acme@zoo ~]$
[acme@zoo ~]$ trace --duration 1 sleep 1
1002.148 (1001.218 ms): nanosleep(rqtp: 0x7fff46c79250 ) = 0
[acme@zoo ~]$
[acme@zoo ~]$ trace -- usleep 1 | tail -5
0.905 ( 0.002 ms): brk( ) = 0x1c82000
0.910 ( 0.003 ms): brk(brk: 0x1ca3000 ) = 0x1ca3000
0.913 ( 0.001 ms): brk( ) = 0x1ca3000
0.990 ( 0.059 ms): nanosleep(rqtp: 0x7fffe31a3280 ) = 0
0.995 ( 0.000 ms): exit_group(
[acme@zoo ~]$
But can't do system wide tracing:
[acme@zoo ~]$ trace
Error: Operation not permitted.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 1.
[acme@zoo ~]$
[acme@zoo ~]$ trace --cpu 0
Error: Operation not permitted.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 1.
[acme@zoo ~]$
If the paranoid level is >= 2, i.e. turn this perf stuff off for !root users:
[acme@zoo ~]$ sudo sh -c 'echo 2 > /proc/sys/kernel/perf_event_paranoid'
[acme@zoo ~]$ cat /proc/sys/kernel/perf_event_paranoid
2
[acme@zoo ~]$
[acme@zoo ~]$ trace usleep 1
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
[acme@zoo ~]$ trace
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
[acme@zoo ~]$ trace --cpu 1
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
If the user manages to get what he/she wants, convincing root not
to be paranoid at all...
[root@zoo ~]# echo -1 > /proc/sys/kernel/perf_event_paranoid
[root@zoo ~]# cat /proc/sys/kernel/perf_event_paranoid
-1
[root@zoo ~]#
[acme@zoo ~]$ ps -eo user,pid,comm | grep Xorg
root 729 Xorg
[acme@zoo ~]$
[acme@zoo ~]$ trace -a --duration 0.001 -e \!select,ioctl,writev | grep Xorg | head -5
23.143 ( 0.003 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
23.152 ( 0.004 ms): Xorg/729 read(fd: 31, buf: 0x2544af0, count: 4096 ) = 8
23.161 ( 0.002 ms): Xorg/729 read(fd: 31, buf: 0x2544af0, count: 4096 ) = -1 EAGAIN Resource temporarily unavailable
23.175 ( 0.002 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
23.235 ( 0.002 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
[acme@zoo ~]$
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-di28olfwd28rvkox7v3hqhu1@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-10-18 00:38:29 +04:00
goto out_error ;
out_error_open :
perf_evlist__strerror_open ( evlist , errno , errbuf , sizeof ( errbuf ) ) ;
out_error :
2013-10-17 19:07:58 +04:00
fprintf ( trace - > output , " %s \n " , errbuf ) ;
2013-10-04 09:17:31 +04:00
goto out_delete_evlist ;
2012-09-27 03:05:56 +04:00
}
perf trace: Improve messages related to /proc/sys/kernel/perf_event_paranoid
kernel/events/core.c has:
/*
* perf event paranoia level:
* -1 - not paranoid at all
* 0 - disallow raw tracepoint access for unpriv
* 1 - disallow cpu events for unpriv
* 2 - disallow kernel profiling for unpriv
*/
int sysctl_perf_event_paranoid __read_mostly = 1;
So, with the default being 1, a non-root user can trace his stuff:
[acme@zoo ~]$ cat /proc/sys/kernel/perf_event_paranoid
1
[acme@zoo ~]$ yes > /dev/null &
[1] 15338
[acme@zoo ~]$ trace -p 15338 | head -5
0.005 ( 0.005 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.045 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.085 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.125 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
0.165 ( 0.001 ms): write(fd: 1</dev/null>, buf: 0x7fe6db765000, count: 4096 ) = 4096
[acme@zoo ~]$
[acme@zoo ~]$ trace --duration 1 sleep 1
1002.148 (1001.218 ms): nanosleep(rqtp: 0x7fff46c79250 ) = 0
[acme@zoo ~]$
[acme@zoo ~]$ trace -- usleep 1 | tail -5
0.905 ( 0.002 ms): brk( ) = 0x1c82000
0.910 ( 0.003 ms): brk(brk: 0x1ca3000 ) = 0x1ca3000
0.913 ( 0.001 ms): brk( ) = 0x1ca3000
0.990 ( 0.059 ms): nanosleep(rqtp: 0x7fffe31a3280 ) = 0
0.995 ( 0.000 ms): exit_group(
[acme@zoo ~]$
But can't do system wide tracing:
[acme@zoo ~]$ trace
Error: Operation not permitted.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 1.
[acme@zoo ~]$
[acme@zoo ~]$ trace --cpu 0
Error: Operation not permitted.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 1.
[acme@zoo ~]$
If the paranoid level is >= 2, i.e. turn this perf stuff off for !root users:
[acme@zoo ~]$ sudo sh -c 'echo 2 > /proc/sys/kernel/perf_event_paranoid'
[acme@zoo ~]$ cat /proc/sys/kernel/perf_event_paranoid
2
[acme@zoo ~]$
[acme@zoo ~]$ trace usleep 1
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
[acme@zoo ~]$ trace
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
[acme@zoo ~]$ trace --cpu 1
Error: Permission denied.
Hint: Check /proc/sys/kernel/perf_event_paranoid setting.
Hint: For your workloads it needs to be <= 1
Hint: For system wide tracing it needs to be set to -1.
Hint: The current value is 2.
[acme@zoo ~]$
If the user manages to get what he/she wants, convincing root not
to be paranoid at all...
[root@zoo ~]# echo -1 > /proc/sys/kernel/perf_event_paranoid
[root@zoo ~]# cat /proc/sys/kernel/perf_event_paranoid
-1
[root@zoo ~]#
[acme@zoo ~]$ ps -eo user,pid,comm | grep Xorg
root 729 Xorg
[acme@zoo ~]$
[acme@zoo ~]$ trace -a --duration 0.001 -e \!select,ioctl,writev | grep Xorg | head -5
23.143 ( 0.003 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
23.152 ( 0.004 ms): Xorg/729 read(fd: 31, buf: 0x2544af0, count: 4096 ) = 8
23.161 ( 0.002 ms): Xorg/729 read(fd: 31, buf: 0x2544af0, count: 4096 ) = -1 EAGAIN Resource temporarily unavailable
23.175 ( 0.002 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
23.235 ( 0.002 ms): Xorg/729 setitimer(which: REAL, value: 0x7fffaadf16e0 ) = 0
[acme@zoo ~]$
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-di28olfwd28rvkox7v3hqhu1@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-10-18 00:38:29 +04:00
}
2012-09-27 03:05:56 +04:00
2013-08-29 08:29:52 +04:00
static int trace__replay ( struct trace * trace )
{
const struct perf_evsel_str_handler handlers [ ] = {
2013-09-28 01:06:19 +04:00
{ " probe:vfs_getname " , trace__vfs_getname , } ,
2013-08-29 08:29:52 +04:00
} ;
2013-10-15 18:27:32 +04:00
struct perf_data_file file = {
. path = input_name ,
. mode = PERF_DATA_MODE_READ ,
} ;
2013-08-29 08:29:52 +04:00
struct perf_session * session ;
2013-11-12 10:25:00 +04:00
struct perf_evsel * evsel ;
2013-08-29 08:29:52 +04:00
int err = - 1 ;
trace - > tool . sample = trace__process_sample ;
trace - > tool . mmap = perf_event__process_mmap ;
2013-09-23 05:44:58 +04:00
trace - > tool . mmap2 = perf_event__process_mmap2 ;
2013-08-29 08:29:52 +04: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 ;
2013-10-15 18:27:32 +04:00
session = perf_session__new ( & file , false , & trace - > tool ) ;
2013-08-29 08:29:52 +04:00
if ( session = = NULL )
return - ENOMEM ;
2013-09-28 23:13:00 +04:00
trace - > host = & session - > machines . host ;
2013-08-29 08:29:52 +04:00
err = perf_session__set_tracepoints_handlers ( session , handlers ) ;
if ( err )
goto out ;
2013-11-12 10:25:00 +04:00
evsel = perf_evlist__find_tracepoint_by_name ( session - > evlist ,
" raw_syscalls:sys_enter " ) ;
if ( evsel = = NULL ) {
pr_err ( " Data file does not have raw_syscalls:sys_enter event \n " ) ;
goto out ;
}
if ( perf_evsel__init_syscall_tp ( evsel , trace__sys_enter ) < 0 | |
perf_evsel__init_sc_tp_ptr_field ( evsel , args ) ) {
pr_err ( " Error during initialize raw_syscalls:sys_enter event \n " ) ;
goto out ;
}
evsel = perf_evlist__find_tracepoint_by_name ( session - > evlist ,
" raw_syscalls:sys_exit " ) ;
if ( evsel = = NULL ) {
pr_err ( " Data file does not have raw_syscalls:sys_exit event \n " ) ;
2013-08-29 08:29:52 +04:00
goto out ;
}
2013-11-12 10:25:00 +04:00
if ( perf_evsel__init_syscall_tp ( evsel , trace__sys_exit ) < 0 | |
perf_evsel__init_sc_tp_uint_field ( evsel , ret ) ) {
pr_err ( " Error during initialize raw_syscalls:sys_exit event \n " ) ;
2013-08-29 08:29:52 +04:00
goto out ;
}
2013-08-29 08:29:53 +04:00
err = parse_target_str ( trace ) ;
if ( err ! = 0 )
goto out ;
2013-08-29 08:29:52 +04:00
setup_pager ( ) ;
err = perf_session__process_events ( session , & trace - > tool ) ;
if ( err )
pr_err ( " Failed to process events, error %d " , err ) ;
2013-10-09 07:26:53 +04:00
else if ( trace - > summary )
trace__fprintf_thread_summary ( trace , trace - > output ) ;
2013-08-29 08:29:52 +04:00
out :
perf_session__delete ( session ) ;
return err ;
}
2012-10-18 00:13:12 +04:00
static size_t trace__fprintf_threads_header ( FILE * fp )
{
size_t printed ;
2013-11-12 18:42:14 +04:00
printed = fprintf ( fp , " \n Summary of events: \n \n " ) ;
2013-10-09 07:26:53 +04:00
return printed ;
}
static size_t thread__dump_stats ( struct thread_trace * ttrace ,
struct trace * trace , FILE * fp )
{
struct stats * stats ;
size_t printed = 0 ;
struct syscall * sc ;
struct int_node * inode = intlist__first ( ttrace - > syscall_stats ) ;
if ( inode = = NULL )
return 0 ;
printed + = fprintf ( fp , " \n " ) ;
2013-11-13 16:21:48 +04:00
printed + = fprintf ( fp , " syscall calls min avg max stddev \n " ) ;
printed + = fprintf ( fp , " (msec) (msec) (msec) (%%) \n " ) ;
printed + = fprintf ( fp , " --------------- -------- --------- --------- --------- ------ \n " ) ;
2013-11-12 18:42:14 +04:00
2013-10-09 07:26:53 +04:00
/* each int_node is a syscall */
while ( inode ) {
stats = inode - > priv ;
if ( stats ) {
double min = ( double ) ( stats - > min ) / NSEC_PER_MSEC ;
double max = ( double ) ( stats - > max ) / NSEC_PER_MSEC ;
double avg = avg_stats ( stats ) ;
double pct ;
u64 n = ( u64 ) stats - > n ;
pct = avg ? 100.0 * stddev_stats ( stats ) / avg : 0.0 ;
avg / = NSEC_PER_MSEC ;
sc = & trace - > syscalls . table [ inode - > i ] ;
2013-11-12 18:42:14 +04:00
printed + = fprintf ( fp , " %-15s " , sc - > name ) ;
2013-11-13 16:21:48 +04:00
printed + = fprintf ( fp , " %8 " PRIu64 " %9.3f %9.3f " ,
2013-11-12 18:10:10 +04:00
n , min , avg ) ;
2013-11-13 16:21:48 +04:00
printed + = fprintf ( fp , " %9.3f %9.2f%% \n " , max , pct ) ;
2013-10-09 07:26:53 +04:00
}
inode = intlist__next ( inode ) ;
}
printed + = fprintf ( fp , " \n \n " ) ;
2012-10-18 00:13:12 +04:00
return printed ;
}
2013-09-28 23:12:59 +04: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 ;
double ratio ;
if ( ttrace = = NULL )
return 0 ;
ratio = ( double ) ttrace - > nr_events / trace - > nr_events * 100.0 ;
2013-11-14 20:43:30 +04:00
printed + = fprintf ( fp , " %s (%d), " , thread__comm_str ( thread ) , thread - > tid ) ;
2013-11-12 18:42:14 +04:00
printed + = fprintf ( fp , " %lu events, " , ttrace - > nr_events ) ;
2013-11-14 20:43:30 +04:00
printed + = fprintf ( fp , " %.1f%% " , ratio ) ;
2013-11-12 18:42:14 +04:00
printed + = fprintf ( fp , " , %.3f msec \n " , ttrace - > runtime_ms ) ;
2013-10-09 07:26:53 +04:00
printed + = thread__dump_stats ( ttrace , trace , fp ) ;
2013-09-28 23:12:59 +04:00
data - > printed + = printed ;
return 0 ;
}
2012-10-18 00:13:12 +04:00
static size_t trace__fprintf_thread_summary ( struct trace * trace , FILE * fp )
{
2013-09-28 23:12:59 +04:00
struct summary_data data = {
. fp = fp ,
. trace = trace
} ;
data . printed = trace__fprintf_threads_header ( fp ) ;
2012-10-18 00:13:12 +04:00
2013-09-28 23:12:59 +04:00
machine__for_each_thread ( trace - > host , trace__fprintf_one_thread , & data ) ;
return data . printed ;
2012-10-18 00:13:12 +04: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 16:56:00 +04: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 19:01:10 +04: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-27 03:05:56 +04:00
int cmd_trace ( int argc , const char * * argv , const char * prefix __maybe_unused )
{
const char * const trace_usage [ ] = {
2012-10-05 09:02:16 +04:00
" perf trace [<options>] [<command>] " ,
" perf trace [<options>] -- <command> [<options>] " ,
2013-09-28 23:13:01 +04:00
" perf trace record [<options>] [<command>] " ,
" perf trace record [<options>] -- <command> [<options>] " ,
2012-09-27 03:05:56 +04:00
NULL
} ;
struct trace trace = {
2013-09-28 01:06:19 +04:00
. audit = {
. machine = audit_detect_machine ( ) ,
. open_id = audit_name_to_syscall ( " open " , trace . audit . machine ) ,
} ,
2012-09-27 03:05:56 +04:00
. 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 19:01:10 +04: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 19:35:21 +04:00
. show_comm = true ,
2012-09-27 03:05:56 +04:00
} ;
2013-08-19 19:01:10 +04:00
const char * output_name = NULL ;
2013-08-09 19:28:31 +04:00
const char * ev_qualifier_str = NULL ;
2012-09-27 03:05:56 +04: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 19:35:21 +04:00
OPT_BOOLEAN ( 0 , " comm " , & trace . show_comm ,
" show the thread COMM next to its id " ) ,
2013-09-28 01:06:19 +04:00
OPT_BOOLEAN ( 0 , " tool_stats " , & trace . show_tool_stats , " show tool stats " ) ,
2013-08-09 19:28:31 +04:00
OPT_STRING ( ' e ' , " expr " , & ev_qualifier_str , " expr " ,
" list of events to trace " ) ,
2013-08-19 19:01:10 +04:00
OPT_STRING ( ' o ' , " output " , & output_name , " file " , " output file name " ) ,
2013-08-29 08:29:52 +04:00
OPT_STRING ( ' i ' , " input " , & input_name , " file " , " Analyze events in file " ) ,
2012-09-27 03:05:56 +04:00
OPT_STRING ( ' p ' , " pid " , & trace . opts . target . pid , " pid " ,
" trace events on existing process id " ) ,
2013-08-20 21:15:45 +04:00
OPT_STRING ( ' t ' , " tid " , & trace . opts . target . tid , " tid " ,
2012-09-27 03:05:56 +04:00
" trace events on existing thread id " ) ,
2013-08-20 21:15:45 +04:00
OPT_BOOLEAN ( ' a ' , " all-cpus " , & trace . opts . target . system_wide ,
2012-09-27 03:05:56 +04:00
" system-wide collection from all CPUs " ) ,
2013-08-20 21:15:45 +04:00
OPT_STRING ( ' C ' , " cpu " , & trace . opts . target . cpu_list , " cpu " ,
2012-09-27 03:05:56 +04:00
" list of cpus to monitor " ) ,
2013-08-29 08:29:52 +04:00
OPT_BOOLEAN ( 0 , " no-inherit " , & trace . opts . no_inherit ,
2012-09-27 03:05:56 +04:00
" child tasks do not inherit counters " ) ,
2013-09-01 14:36:12 +04:00
OPT_CALLBACK ( ' m ' , " mmap-pages " , & trace . opts . mmap_pages , " pages " ,
" number of mmap data pages " ,
perf_evlist__parse_mmap_pages ) ,
2013-08-20 21:15:45 +04:00
OPT_STRING ( ' u ' , " uid " , & trace . opts . target . uid_str , " user " ,
2012-09-27 03:05:56 +04: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 16:56:00 +04:00
OPT_CALLBACK ( 0 , " duration " , & trace , " float " ,
" show only events with duration > N.M ms " ,
trace__set_duration ) ,
2012-10-18 00:13:12 +04:00
OPT_BOOLEAN ( 0 , " sched " , & trace . sched , " show blocking scheduler events " ) ,
2013-08-22 23:49:54 +04:00
OPT_INCR ( ' v ' , " verbose " , & verbose , " be more verbose " ) ,
2013-09-04 22:37:43 +04:00
OPT_BOOLEAN ( ' T ' , " time " , & trace . full_time ,
" Show full timestamp, not time relative to first start " ) ,
2013-11-12 20:31:15 +04:00
OPT_BOOLEAN ( ' s ' , " summary " , & trace . summary_only ,
" Show only syscall summary with statistics " ) ,
OPT_BOOLEAN ( ' S ' , " with-summary " , & trace . summary ,
" Show all syscalls and summary with statistics " ) ,
2012-09-27 03:05:56 +04:00
OPT_END ( )
} ;
int err ;
2012-10-05 09:02:13 +04:00
char bf [ BUFSIZ ] ;
2012-09-27 03:05:56 +04:00
2013-09-28 23:13:01 +04:00
if ( ( argc > 1 ) & & ( strcmp ( argv [ 1 ] , " record " ) = = 0 ) )
return trace__record ( argc - 2 , & argv [ 2 ] ) ;
2012-09-27 03:05:56 +04:00
argc = parse_options ( argc , argv , trace_options , trace_usage , 0 ) ;
2013-11-12 20:31:15 +04:00
/* summary_only implies summary option, but don't overwrite summary if set */
if ( trace . summary_only )
trace . summary = trace . summary_only ;
2013-08-19 19:01:10 +04: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 19:28:31 +04:00
if ( ev_qualifier_str ! = NULL ) {
2013-08-21 19:56:21 +04: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 19:28:31 +04:00
if ( trace . ev_qualifier = = NULL ) {
2013-08-19 19:01:10 +04:00
fputs ( " Not enough memory to parse event qualifier " ,
trace . output ) ;
err = - ENOMEM ;
goto out_close ;
2013-08-09 19:28:31 +04:00
}
}
2013-11-12 23:46:16 +04:00
err = target__validate ( & trace . opts . target ) ;
2012-10-05 09:02:13 +04:00
if ( err ) {
2013-11-12 23:46:16 +04:00
target__strerror ( & trace . opts . target , err , bf , sizeof ( bf ) ) ;
2013-08-19 19:01:10 +04:00
fprintf ( trace . output , " %s " , bf ) ;
goto out_close ;
2012-10-05 09:02:13 +04:00
}
2013-11-12 23:46:16 +04:00
err = target__parse_uid ( & trace . opts . target ) ;
2012-09-27 03:05:56 +04:00
if ( err ) {
2013-11-12 23:46:16 +04:00
target__strerror ( & trace . opts . target , err , bf , sizeof ( bf ) ) ;
2013-08-19 19:01:10 +04:00
fprintf ( trace . output , " %s " , bf ) ;
goto out_close ;
2012-09-27 03:05:56 +04:00
}
2013-11-12 23:46:16 +04:00
if ( ! argc & & target__none ( & trace . opts . target ) )
2012-10-05 09:02:14 +04:00
trace . opts . target . system_wide = true ;
2013-08-29 08:29:52 +04:00
if ( input_name )
err = trace__replay ( & trace ) ;
else
err = trace__run ( & trace , argc , argv ) ;
2012-10-18 00:13:12 +04:00
2013-08-19 19:01:10 +04:00
out_close :
if ( output_name ! = NULL )
fclose ( trace . output ) ;
out :
2012-10-18 00:13:12 +04:00
return err ;
2012-09-27 03:05:56 +04:00
}