diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-09-02 09:39:21 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-09-02 13:58:18 -0400 |
| commit | 6e7eeb51106d2e9ef7975214747e76d23c5d01af (patch) | |
| tree | c138f04533f0c2dd1f8157ea62bc8a8a862cd3aa /tools | |
| parent | 7bfb7e6bdd906f11ee9e751b3fec4f4fc728e818 (diff) | |
perf trace: Allow syscall arg formatters to mask args
The futex syscall ignores some arguments according to the 'operation'
arg, so allow arg formatters to mask those.
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-abqrg3oldgfsdnltfrvso9f7@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/builtin-trace.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 69a065e51135..c29692ab1891 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
| @@ -15,14 +15,16 @@ | |||
| 15 | #include <stdlib.h> | 15 | #include <stdlib.h> |
| 16 | #include <sys/mman.h> | 16 | #include <sys/mman.h> |
| 17 | 17 | ||
| 18 | static size_t syscall_arg__scnprintf_hex(char *bf, size_t size, unsigned long arg) | 18 | static size_t syscall_arg__scnprintf_hex(char *bf, size_t size, |
| 19 | unsigned long arg, u8 *arg_mask __maybe_unused) | ||
| 19 | { | 20 | { |
| 20 | return scnprintf(bf, size, "%#lx", arg); | 21 | return scnprintf(bf, size, "%#lx", arg); |
| 21 | } | 22 | } |
| 22 | 23 | ||
| 23 | #define SCA_HEX syscall_arg__scnprintf_hex | 24 | #define SCA_HEX syscall_arg__scnprintf_hex |
| 24 | 25 | ||
| 25 | static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, unsigned long arg) | 26 | static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, |
| 27 | unsigned long arg, u8 *arg_mask __maybe_unused) | ||
| 26 | { | 28 | { |
| 27 | int printed = 0, prot = arg; | 29 | int printed = 0, prot = arg; |
| 28 | 30 | ||
| @@ -52,7 +54,8 @@ static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, unsigned l | |||
| 52 | 54 | ||
| 53 | #define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot | 55 | #define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot |
| 54 | 56 | ||
| 55 | static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, unsigned long arg) | 57 | static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, |
| 58 | unsigned long arg, u8 *arg_mask __maybe_unused) | ||
| 56 | { | 59 | { |
| 57 | int printed = 0, flags = arg; | 60 | int printed = 0, flags = arg; |
| 58 | 61 | ||
| @@ -92,7 +95,8 @@ static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, unsigned | |||
| 92 | 95 | ||
| 93 | #define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags | 96 | #define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags |
| 94 | 97 | ||
| 95 | static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size, unsigned long arg) | 98 | static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size, |
| 99 | unsigned long arg, u8 *arg_mask __maybe_unused) | ||
| 96 | { | 100 | { |
| 97 | int behavior = arg; | 101 | int behavior = arg; |
| 98 | 102 | ||
| @@ -136,7 +140,7 @@ static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size, uns | |||
| 136 | static struct syscall_fmt { | 140 | static struct syscall_fmt { |
| 137 | const char *name; | 141 | const char *name; |
| 138 | const char *alias; | 142 | const char *alias; |
| 139 | size_t (*arg_scnprintf[6])(char *bf, size_t size, unsigned long arg); | 143 | size_t (*arg_scnprintf[6])(char *bf, size_t size, unsigned long arg, u8 *arg_mask); |
| 140 | bool errmsg; | 144 | bool errmsg; |
| 141 | bool timeout; | 145 | bool timeout; |
| 142 | bool hexret; | 146 | bool hexret; |
| @@ -198,7 +202,8 @@ struct syscall { | |||
| 198 | const char *name; | 202 | const char *name; |
| 199 | bool filtered; | 203 | bool filtered; |
| 200 | struct syscall_fmt *fmt; | 204 | struct syscall_fmt *fmt; |
| 201 | size_t (**arg_scnprintf)(char *bf, size_t size, unsigned long arg); | 205 | size_t (**arg_scnprintf)(char *bf, size_t size, |
| 206 | unsigned long arg, u8 *args_mask); | ||
| 202 | }; | 207 | }; |
| 203 | 208 | ||
| 204 | static size_t fprintf_duration(unsigned long t, FILE *fp) | 209 | static size_t fprintf_duration(unsigned long t, FILE *fp) |
| @@ -443,17 +448,23 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size, | |||
| 443 | 448 | ||
| 444 | if (sc->tp_format != NULL) { | 449 | if (sc->tp_format != NULL) { |
| 445 | struct format_field *field; | 450 | struct format_field *field; |
| 451 | u8 mask = 0, bit = 1; | ||
| 452 | |||
| 453 | for (field = sc->tp_format->format.fields->next; field; | ||
| 454 | field = field->next, ++i, bit <<= 1) { | ||
| 455 | if (mask & bit) | ||
| 456 | continue; | ||
| 446 | 457 | ||
| 447 | for (field = sc->tp_format->format.fields->next; field; field = field->next) { | ||
| 448 | printed += scnprintf(bf + printed, size - printed, | 458 | printed += scnprintf(bf + printed, size - printed, |
| 449 | "%s%s: ", printed ? ", " : "", field->name); | 459 | "%s%s: ", printed ? ", " : "", field->name); |
| 450 | 460 | ||
| 451 | if (sc->arg_scnprintf && sc->arg_scnprintf[i]) | 461 | if (sc->arg_scnprintf && sc->arg_scnprintf[i]) { |
| 452 | printed += sc->arg_scnprintf[i](bf + printed, size - printed, args[i]); | 462 | printed += sc->arg_scnprintf[i](bf + printed, size - printed, |
| 453 | else | 463 | args[i], &mask); |
| 464 | } else { | ||
| 454 | printed += scnprintf(bf + printed, size - printed, | 465 | printed += scnprintf(bf + printed, size - printed, |
| 455 | "%ld", args[i]); | 466 | "%ld", args[i]); |
| 456 | ++i; | 467 | } |
| 457 | } | 468 | } |
| 458 | } else { | 469 | } else { |
| 459 | while (i < 6) { | 470 | while (i < 6) { |
