Commit 601897b5 authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf auxtrace: Add option to synthesize branch stacks on samples

Add AUX area tracing option 'l' to synthesize branch stacks on samples
just like sample type PERF_SAMPLE_BRANCH_STACK.  This is taken into use
by Intel PT in a subsequent patch.
Based-on-patch-by: default avatarAndi Kleen <ak@linux.intel.com>
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1443186956-18718-9-git-send-email-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 35ca01c1
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
e synthesize error events e synthesize error events
d create a debug log d create a debug log
g synthesize a call chain (use with i or x) g synthesize a call chain (use with i or x)
l synthesize last branch entries (use with i or x)
The default is all events i.e. the same as --itrace=ibxe The default is all events i.e. the same as --itrace=ibxe
...@@ -20,3 +21,6 @@ ...@@ -20,3 +21,6 @@
Also the call chain size (default 16, max. 1024) for instructions or Also the call chain size (default 16, max. 1024) for instructions or
transactions events can be specified. transactions events can be specified.
Also the number of last branch entries (default 64, max. 1024) for
instructions or transactions events can be specified.
...@@ -926,6 +926,8 @@ s64 perf_event__process_auxtrace(struct perf_tool *tool, ...@@ -926,6 +926,8 @@ s64 perf_event__process_auxtrace(struct perf_tool *tool,
#define PERF_ITRACE_DEFAULT_PERIOD 100000 #define PERF_ITRACE_DEFAULT_PERIOD 100000
#define PERF_ITRACE_DEFAULT_CALLCHAIN_SZ 16 #define PERF_ITRACE_DEFAULT_CALLCHAIN_SZ 16
#define PERF_ITRACE_MAX_CALLCHAIN_SZ 1024 #define PERF_ITRACE_MAX_CALLCHAIN_SZ 1024
#define PERF_ITRACE_DEFAULT_LAST_BRANCH_SZ 64
#define PERF_ITRACE_MAX_LAST_BRANCH_SZ 1024
void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts) void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts)
{ {
...@@ -936,6 +938,7 @@ void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts) ...@@ -936,6 +938,7 @@ void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts)
synth_opts->period_type = PERF_ITRACE_DEFAULT_PERIOD_TYPE; synth_opts->period_type = PERF_ITRACE_DEFAULT_PERIOD_TYPE;
synth_opts->period = PERF_ITRACE_DEFAULT_PERIOD; synth_opts->period = PERF_ITRACE_DEFAULT_PERIOD;
synth_opts->callchain_sz = PERF_ITRACE_DEFAULT_CALLCHAIN_SZ; synth_opts->callchain_sz = PERF_ITRACE_DEFAULT_CALLCHAIN_SZ;
synth_opts->last_branch_sz = PERF_ITRACE_DEFAULT_LAST_BRANCH_SZ;
} }
/* /*
...@@ -1043,6 +1046,23 @@ int itrace_parse_synth_opts(const struct option *opt, const char *str, ...@@ -1043,6 +1046,23 @@ int itrace_parse_synth_opts(const struct option *opt, const char *str,
synth_opts->callchain_sz = val; synth_opts->callchain_sz = val;
} }
break; break;
case 'l':
synth_opts->last_branch = true;
synth_opts->last_branch_sz =
PERF_ITRACE_DEFAULT_LAST_BRANCH_SZ;
while (*p == ' ' || *p == ',')
p += 1;
if (isdigit(*p)) {
unsigned int val;
val = strtoul(p, &endptr, 10);
p = endptr;
if (!val ||
val > PERF_ITRACE_MAX_LAST_BRANCH_SZ)
goto out_err;
synth_opts->last_branch_sz = val;
}
break;
case ' ': case ' ':
case ',': case ',':
break; break;
......
...@@ -63,7 +63,9 @@ enum itrace_period_type { ...@@ -63,7 +63,9 @@ enum itrace_period_type {
* @calls: limit branch samples to calls (can be combined with @returns) * @calls: limit branch samples to calls (can be combined with @returns)
* @returns: limit branch samples to returns (can be combined with @calls) * @returns: limit branch samples to returns (can be combined with @calls)
* @callchain: add callchain to 'instructions' events * @callchain: add callchain to 'instructions' events
* @last_branch: add branch context to 'instruction' events
* @callchain_sz: maximum callchain size * @callchain_sz: maximum callchain size
* @last_branch_sz: branch context size
* @period: 'instructions' events period * @period: 'instructions' events period
* @period_type: 'instructions' events period type * @period_type: 'instructions' events period type
*/ */
...@@ -79,7 +81,9 @@ struct itrace_synth_opts { ...@@ -79,7 +81,9 @@ struct itrace_synth_opts {
bool calls; bool calls;
bool returns; bool returns;
bool callchain; bool callchain;
bool last_branch;
unsigned int callchain_sz; unsigned int callchain_sz;
unsigned int last_branch_sz;
unsigned long long period; unsigned long long period;
enum itrace_period_type period_type; enum itrace_period_type period_type;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment