diff options
author | Ingo Molnar <mingo@kernel.org> | 2016-10-24 20:42:42 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-10-24 20:42:42 +0200 |
commit | 76e2d2617d767c445498c4c4b1162eb2201cdd77 (patch) | |
tree | e03764dba70ea6993366e25d16e1735b2d40cd26 /tools/perf/util/parse-branch-options.c | |
parent | e9c848928abf4cb60601e9ae7d336f0333c98bca (diff) | |
parent | 04b553ad7dc347eabd3cb4705932272453175a80 (diff) | |
download | linux-76e2d2617d767c445498c4c4b1162eb2201cdd77.tar.bz2 |
Merge tag 'perf-core-for-mingo-20161024' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
New features:
- Dynamicly change verbosity level by pressing 'V' in the 'perf top/report'
hists TUI browser (Alexis Berlemont)
- Implement 'perf trace --delay' in the same fashion as in 'perf record --delay',
to skip sampling workload initialization events (Alexis Berlemont)
- Make vendor named events case insensitive in 'perf list', i.e.
'perf list LONGEST_LAT' works just the same as 'perf list longest_lat' (Andi Kleen)
- Show instruction bytes and lenght in 'perf script' for Intel PT and BTS (Andi Kleen, Adrian Hunter)
E.g:
% perf record -e intel_pt// foo
% perf script --itrace=i0ns -F ip,insn,insnlen
ffffffff8101232f ilen: 5 insn: 0f 1f 44 00 00
ffffffff81012334 ilen: 1 insn: 5b
ffffffff81012335 ilen: 1 insn: 5d
ffffffff81012336 ilen: 1 insn: c3
ffffffff810123e3 ilen: 1 insn: 5b
ffffffff810123e4 ilen: 2 insn: 41 5c
ffffffff810123e6 ilen: 1 insn: 5d
ffffffff810123e7 ilen: 1 insn: c3
ffffffff810124a6 ilen: 2 insn: 31 c0
ffffffff810124a8 ilen: 9 insn: 41 83 bc 24 a8 01 00 00 01
ffffffff810124b1 ilen: 2 insn: 75 87
- Allow enabling the perf_event_attr.branch_type attribute member: (Andi Kleen)
perf record -e sched:sched_switch,cpu/cpu-cycles,branch_type=any/ ...
- Add unwinding support for jitdump (Stefano Sanfilippo)
Fixes:
- Use raw_syscall:sys_enter timestamp in 'perf trace' (Arnaldo Carvalho de Melo)
Infrastructure:
- Allow jitdump to be built without libdwarf (Maciej Debski)
- Sync x86's syscall table tools/ copy (Arnaldo Carvalho de Melo)
- Fixes to avoid calling die() in library fuctions already propagating other
errors (Arnaldo Carvalho de Melo)
- Improvements to allow libtraceevent to be properly installed in distro
packages (Jiri Olsa)
- Removing coresight miscellaneous debug output (Mathieu Poirier)
- Cache align the 'perf bench futex' worker struct (Sebastian Andrzej Siewior)
Documentation:
- Minor improvements on the documentation of event parameters (Andi Kleen)
- Add jitdump format specification document (Stephane Eranian)
Spelling fixes:
- Fix typo "No enough" to "Not enough" (Alexander Alemayhu)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf/util/parse-branch-options.c')
-rw-r--r-- | tools/perf/util/parse-branch-options.c | 85 |
1 files changed, 47 insertions, 38 deletions
diff --git a/tools/perf/util/parse-branch-options.c b/tools/perf/util/parse-branch-options.c index afc088dd7d20..3634d6974300 100644 --- a/tools/perf/util/parse-branch-options.c +++ b/tools/perf/util/parse-branch-options.c @@ -31,59 +31,51 @@ static const struct branch_mode branch_modes[] = { BRANCH_END }; -int -parse_branch_stack(const struct option *opt, const char *str, int unset) +int parse_branch_str(const char *str, __u64 *mode) { #define ONLY_PLM \ (PERF_SAMPLE_BRANCH_USER |\ PERF_SAMPLE_BRANCH_KERNEL |\ PERF_SAMPLE_BRANCH_HV) - uint64_t *mode = (uint64_t *)opt->value; + int ret = 0; + char *p, *s; + char *os = NULL; const struct branch_mode *br; - char *s, *os = NULL, *p; - int ret = -1; - if (unset) + if (str == NULL) { + *mode = PERF_SAMPLE_BRANCH_ANY; return 0; + } - /* - * cannot set it twice, -b + --branch-filter for instance - */ - if (*mode) + /* because str is read-only */ + s = os = strdup(str); + if (!s) return -1; - /* str may be NULL in case no arg is passed to -b */ - if (str) { - /* because str is read-only */ - s = os = strdup(str); - if (!s) - return -1; - - for (;;) { - p = strchr(s, ','); - if (p) - *p = '\0'; - - for (br = branch_modes; br->name; br++) { - if (!strcasecmp(s, br->name)) - break; - } - if (!br->name) { - ui__warning("unknown branch filter %s," - " check man page\n", s); - goto error; - } - - *mode |= br->mode; - - if (!p) - break; + for (;;) { + p = strchr(s, ','); + if (p) + *p = '\0'; - s = p + 1; + for (br = branch_modes; br->name; br++) { + if (!strcasecmp(s, br->name)) + break; + } + if (!br->name) { + ret = -1; + ui__warning("unknown branch filter %s," + " check man page\n", s); + goto error; } + + *mode |= br->mode; + + if (!p) + break; + + s = p + 1; } - ret = 0; /* default to any branch */ if ((*mode & ~ONLY_PLM) == 0) { @@ -93,3 +85,20 @@ error: free(os); return ret; } + +int +parse_branch_stack(const struct option *opt, const char *str, int unset) +{ + __u64 *mode = (__u64 *)opt->value; + + if (unset) + return 0; + + /* + * cannot set it twice, -b + --branch-filter for instance + */ + if (*mode) + return -1; + + return parse_branch_str(str, mode); +} |