Commit 520a2ebc authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf report: Add Instruction Tracing support

Add support for decoding an AUX area assuming it contains instruction
tracing data.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1429903807-20559-4-git-send-email-adrian.hunter@intel.com
[ Do not use -Z as an alternative to --itrace ]
[ Fixed initialization of itrace_synth_opts struct fields on older gcc versions ]
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 6d5cdd64
...@@ -327,6 +327,33 @@ OPTIONS ...@@ -327,6 +327,33 @@ OPTIONS
include::callchain-overhead-calculation.txt[] include::callchain-overhead-calculation.txt[]
--itrace::
Options for decoding instruction tracing data. The options are:
i synthesize instructions events
b synthesize branches events
c synthesize branches events (calls only)
r synthesize branches events (returns only)
e synthesize error events
d create a debug log
g synthesize a call chain for instructions events
The default is all events i.e. the same as --itrace=ibe
In addition, the period (default 100000) for instructions events
can be specified in units of:
i instructions
t ticks
ms milliseconds
us microseconds
ns nanoseconds (default)
Also the call chain size (default 16, max. 1024) for instructions
events can be specified.
To disable decoding entirely, use --no-itrace.
SEE ALSO SEE ALSO
-------- --------
linkperf:perf-stat[1], linkperf:perf-annotate[1] linkperf:perf-stat[1], linkperf:perf-annotate[1]
...@@ -36,6 +36,8 @@ ...@@ -36,6 +36,8 @@
#include "util/data.h" #include "util/data.h"
#include "arch/common.h" #include "arch/common.h"
#include "util/auxtrace.h"
#include <dlfcn.h> #include <dlfcn.h>
#include <linux/bitmap.h> #include <linux/bitmap.h>
...@@ -585,6 +587,7 @@ parse_percent_limit(const struct option *opt, const char *str, ...@@ -585,6 +587,7 @@ parse_percent_limit(const struct option *opt, const char *str,
int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
{ {
struct perf_session *session; struct perf_session *session;
struct itrace_synth_opts itrace_synth_opts = { .set = 0, };
struct stat st; struct stat st;
bool has_br_stack = false; bool has_br_stack = false;
int branch_mode = -1; int branch_mode = -1;
...@@ -607,6 +610,9 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -607,6 +610,9 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
.attr = perf_event__process_attr, .attr = perf_event__process_attr,
.tracing_data = perf_event__process_tracing_data, .tracing_data = perf_event__process_tracing_data,
.build_id = perf_event__process_build_id, .build_id = perf_event__process_build_id,
.id_index = perf_event__process_id_index,
.auxtrace_info = perf_event__process_auxtrace_info,
.auxtrace = perf_event__process_auxtrace,
.ordered_events = true, .ordered_events = true,
.ordering_requires_timestamps = true, .ordering_requires_timestamps = true,
}, },
...@@ -717,6 +723,9 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -717,6 +723,9 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
"Don't show entries under that percent", parse_percent_limit), "Don't show entries under that percent", parse_percent_limit),
OPT_CALLBACK(0, "percentage", NULL, "relative|absolute", OPT_CALLBACK(0, "percentage", NULL, "relative|absolute",
"how to display percentage of filtered entries", parse_filter_percentage), "how to display percentage of filtered entries", parse_filter_percentage),
OPT_CALLBACK_OPTARG(0, "itrace", &itrace_synth_opts, NULL, "opts",
"Instruction Tracing options",
itrace_parse_synth_opts),
OPT_END() OPT_END()
}; };
struct perf_data_file file = { struct perf_data_file file = {
...@@ -761,6 +770,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -761,6 +770,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
report.queue_size); report.queue_size);
} }
session->itrace_synth_opts = &itrace_synth_opts;
report.session = session; report.session = session;
has_br_stack = perf_header__has_feat(&session->header, has_br_stack = perf_header__has_feat(&session->header,
......
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