Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 288732
b: refs/heads/master
c: a5aabda
h: refs/heads/master
v: v3
  • Loading branch information
Stephane Eranian authored and Ingo Molnar committed Mar 9, 2012
1 parent f5c68d4 commit 8262f9a
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 35 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 114382a0aea97974803c942f106d462cbca5c64d
refs/heads/master: a5aabdacde9caff54886ae454e0fad2f26929753
23 changes: 14 additions & 9 deletions trunk/tools/perf/Documentation/perf-record.txt
Original file line number Diff line number Diff line change
Expand Up @@ -153,14 +153,19 @@ corresponding events, i.e., they always refer to events defined earlier on the c
line.

-b::
--branch-stack::
--branch-any::
Enable taken branch stack sampling. Any type of taken branch may be sampled.
This is a shortcut for --branch-filter any. See --branch-filter for more infos.

-j::
--branch-filter::
Enable taken branch stack sampling. Each sample captures a series of consecutive
taken branches. The number of branches captured with each sample depends on the
underlying hardware, the type of branches of interest, and the executed code.
It is possible to select the types of branches captured by enabling filters. The
following filters are defined:

- any : any type of branches
- any: any type of branches
- any_call: any function call or system call
- any_ret: any function return or system call return
- any_ind: any indirect branch
Expand All @@ -169,13 +174,13 @@ following filters are defined:
- hv: only when the target is at the hypervisor level

+
At least one of any, any_call, any_ret, any_ind must be provided. The privilege levels may
be ommitted, in which case, the privilege levels of the associated event are applied to the
branch filter. Both kernel (k) and hypervisor (hv) privilege levels are subject to
permissions. When sampling on multiple events, branch stack sampling is enabled for all
the sampling events. The sampled branch type is the same for all events.
Note that taken branch sampling may not be available on all processors.
The various filters must be specified as a comma separated list: -b any_ret,u,k
The option requires at least one branch type among any, any_call, any_ret, ind_call.
The privilege levels may be ommitted, in which case, the privilege levels of the associated
event are applied to the branch filter. Both kernel (k) and hypervisor (hv) privilege
levels are subject to permissions. When sampling on multiple events, branch stack sampling
is enabled for all the sampling events. The sampled branch type is the same for all events.
The various filters must be specified as a comma separated list: --branch-filter any_ret,u,k
Note that this feature may not be available on all processors.

SEE ALSO
--------
Expand Down
68 changes: 43 additions & 25 deletions trunk/tools/perf/builtin-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -660,7 +660,7 @@ static const struct branch_mode branch_modes[] = {
};

static int
parse_branch_stack(const struct option *opt, const char *str, int unset __used)
parse_branch_stack(const struct option *opt, const char *str, int unset)
{
#define ONLY_PLM \
(PERF_SAMPLE_BRANCH_USER |\
Expand All @@ -669,40 +669,53 @@ parse_branch_stack(const struct option *opt, const char *str, int unset __used)

uint64_t *mode = (uint64_t *)opt->value;
const struct branch_mode *br;
char *s, *os, *p;
char *s, *os = NULL, *p;
int ret = -1;

*mode = 0;
if (unset)
return 0;

/* because str is read-only */
s = os = strdup(str);
if (!s)
/*
* cannot set it twice, -b + --branch-filter for instance
*/
if (*mode)
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)
goto error;
/* 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;
*mode |= br->mode;

if (!p)
break;
if (!p)
break;

s = p + 1;
s = p + 1;
}
}
ret = 0;

/* default to any branch */
if ((*mode & ~ONLY_PLM) == 0) {
error("need at least one branch type with -b\n");
ret = -1;
*mode = PERF_SAMPLE_BRANCH_ANY;
}
error:
free(os);
Expand Down Expand Up @@ -798,8 +811,13 @@ const struct option record_options[] = {
"monitor event in cgroup name only",
parse_cgroups),
OPT_STRING('u', "uid", &record.uid_str, "user", "user to profile"),
OPT_CALLBACK('b', "branch-stack", &record.opts.branch_stack,
"branch mode mask", "branch stack sampling modes",

OPT_CALLBACK_NOOPT('b', "branch-any", &record.opts.branch_stack,
"branch any", "sample any taken branches",
parse_branch_stack),

OPT_CALLBACK('j', "branch-filter", &record.opts.branch_stack,
"branch filter mask", "branch stack filter modes",
parse_branch_stack),
OPT_END()
};
Expand Down

0 comments on commit 8262f9a

Please sign in to comment.