From: Adrian Hunter <adrian.hunter@intel.com>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
linux-kernel@vger.kernel.org, David Ahern <dsahern@gmail.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@gmail.com>,
Paul Mackerras <paulus@samba.org>,
Stephane Eranian <eranian@google.com>
Subject: [PATCH 12/25] perf session: Add Instruction Tracing options
Date: Tue, 11 Nov 2014 16:16:50 +0200 [thread overview]
Message-ID: <1415715423-15563-13-git-send-email-adrian.hunter@intel.com> (raw)
In-Reply-To: <1415715423-15563-1-git-send-email-adrian.hunter@intel.com>
It is assumed that Instruction Trace decoding will
synthesize events for consumption by other tools.
The nature of Instruction Tracing suggests the
initial inclusion of options for "instructions"
and "branches" events, but more could be added
as needed.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
tools/perf/util/itrace.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/itrace.h | 43 +++++++++++++++
tools/perf/util/session.h | 2 +
3 files changed, 176 insertions(+)
diff --git a/tools/perf/util/itrace.c b/tools/perf/util/itrace.c
index 08372a9..2a3a7ce 100644
--- a/tools/perf/util/itrace.c
+++ b/tools/perf/util/itrace.c
@@ -34,6 +34,7 @@
#include "event.h"
#include "debug.h"
+#include "parse-options.h"
int itrace_mmap__mmap(struct itrace_mmap *mm, struct itrace_mmap_params *mp,
void *userpg, int fd)
@@ -205,6 +206,136 @@ int perf_event__synthesize_itrace(struct perf_tool *tool,
return process(tool, &ev, NULL, NULL);
}
+#define PERF_ITRACE_DEFAULT_PERIOD_TYPE PERF_ITRACE_PERIOD_NANOSECS
+#define PERF_ITRACE_DEFAULT_PERIOD 100000
+#define PERF_ITRACE_DEFAULT_CALLCHAIN_SZ 16
+#define PERF_ITRACE_MAX_CALLCHAIN_SZ 1024
+
+void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts)
+{
+ synth_opts->instructions = true;
+ synth_opts->branches = true;
+ synth_opts->errors = true;
+ synth_opts->period_type = PERF_ITRACE_DEFAULT_PERIOD_TYPE;
+ synth_opts->period = PERF_ITRACE_DEFAULT_PERIOD;
+ synth_opts->callchain_sz = PERF_ITRACE_DEFAULT_CALLCHAIN_SZ;
+}
+
+int itrace_parse_synth_opts(const struct option *opt, const char *str,
+ int unset)
+{
+ struct itrace_synth_opts *synth_opts = opt->value;
+ const char *p;
+ char *endptr;
+
+ synth_opts->set = true;
+
+ if (unset) {
+ synth_opts->dont_decode = true;
+ return 0;
+ }
+
+ if (!str) {
+ itrace_synth_opts__set_default(synth_opts);
+ return 0;
+ }
+
+ for (p = str; *p;) {
+ switch (*p++) {
+ case 'i':
+ synth_opts->instructions = true;
+ while (*p == ' ' || *p == ',')
+ p += 1;
+ if (isdigit(*p)) {
+ synth_opts->period = strtoull(p, &endptr, 10);
+ p = endptr;
+ while (*p == ' ' || *p == ',')
+ p += 1;
+ switch (*p++) {
+ case 'i':
+ synth_opts->period_type =
+ PERF_ITRACE_PERIOD_INSTRUCTIONS;
+ break;
+ case 't':
+ synth_opts->period_type =
+ PERF_ITRACE_PERIOD_TICKS;
+ break;
+ case 'm':
+ synth_opts->period *= 1000;
+ /* Fall through */
+ case 'u':
+ synth_opts->period *= 1000;
+ /* Fall through */
+ case 'n':
+ if (*p++ != 's')
+ goto out_err;
+ synth_opts->period_type =
+ PERF_ITRACE_PERIOD_NANOSECS;
+ break;
+ case '\0':
+ goto out;
+ default:
+ goto out_err;
+ }
+ }
+ break;
+ case 'b':
+ synth_opts->branches = true;
+ break;
+ case 'e':
+ synth_opts->errors = true;
+ break;
+ case 'd':
+ synth_opts->log = true;
+ break;
+ case 'c':
+ synth_opts->branches = true;
+ synth_opts->calls = true;
+ break;
+ case 'r':
+ synth_opts->branches = true;
+ synth_opts->returns = true;
+ break;
+ case 'g':
+ synth_opts->instructions = true;
+ synth_opts->callchain = true;
+ synth_opts->callchain_sz =
+ PERF_ITRACE_DEFAULT_CALLCHAIN_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_CALLCHAIN_SZ)
+ goto out_err;
+ synth_opts->callchain_sz = val;
+ }
+ break;
+ case ' ':
+ case ',':
+ break;
+ default:
+ goto out_err;
+ }
+ }
+out:
+ if (synth_opts->instructions) {
+ if (!synth_opts->period_type)
+ synth_opts->period_type =
+ PERF_ITRACE_DEFAULT_PERIOD_TYPE;
+ if (!synth_opts->period)
+ synth_opts->period = PERF_ITRACE_DEFAULT_PERIOD;
+ }
+
+ return 0;
+
+out_err:
+ pr_err("Bad instruction trace options '%s'\n", str);
+ return -EINVAL;
+}
+
int itrace_mmap__read(struct itrace_mmap *mm, struct itrace_record *itr,
struct perf_tool *tool, process_itrace_t fn)
{
diff --git a/tools/perf/util/itrace.h b/tools/perf/util/itrace.h
index 1cf5d16..76e70ea 100644
--- a/tools/perf/util/itrace.h
+++ b/tools/perf/util/itrace.h
@@ -29,9 +29,49 @@ union perf_event;
struct perf_session;
struct perf_evlist;
struct perf_tool;
+struct option;
struct record_opts;
struct itrace_info_event;
+enum itrace_period_type {
+ PERF_ITRACE_PERIOD_INSTRUCTIONS,
+ PERF_ITRACE_PERIOD_TICKS,
+ PERF_ITRACE_PERIOD_NANOSECS,
+};
+
+/**
+ * struct itrace_synth_opts - Instruction Tracing synthesis options.
+ * @set: indicates whether or not options have been set
+ * @inject: indicates the event (not just the sample) must be fully synthesized
+ * because 'perf inject' will write it out
+ * @instructions: whether to synthesize 'instructions' events
+ * @branches: whether to synthesize 'branches' events
+ * @errors: whether to synthesize decoder error events
+ * @dont_decode: whether to skip decoding entirely
+ * @log: write a decoding log
+ * @calls: limit branch samples to calls (can be combined with @returns)
+ * @returns: limit branch samples to returns (can be combined with @calls)
+ * @callchain: add callchain to 'instructions' events
+ * @callchain_sz: maximum callchain size
+ * @period: 'instructions' events period
+ * @period_type: 'instructions' events period type
+ */
+struct itrace_synth_opts {
+ bool set;
+ bool inject;
+ bool instructions;
+ bool branches;
+ bool errors;
+ bool dont_decode;
+ bool log;
+ bool calls;
+ bool returns;
+ bool callchain;
+ unsigned int callchain_sz;
+ unsigned long long period;
+ enum itrace_period_type period_type;
+};
+
/**
* struct itrace - session callbacks to allow Instruction Trace data decoding.
* @process_event: lets the decoder see all session events
@@ -170,6 +210,9 @@ int perf_event__synthesize_itrace(struct perf_tool *tool,
perf_event__handler_t process,
size_t size, u64 offset, u64 ref, int idx,
u32 tid, u32 cpu);
+int itrace_parse_synth_opts(const struct option *opt, const char *str,
+ int unset);
+void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts);
static inline int itrace__process_event(struct perf_session *session,
union perf_event *event,
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index 6f8ac2f..ccf6a75 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -16,12 +16,14 @@ struct ip_callchain;
struct thread;
struct itrace;
+struct itrace_synth_opts;
struct perf_session {
struct perf_header header;
struct machines machines;
struct perf_evlist *evlist;
struct itrace *itrace;
+ struct itrace_synth_opts *itrace_synth_opts;
struct trace_event tevent;
struct events_stats stats;
bool repipe;
--
1.9.1
next prev parent reply other threads:[~2014-11-11 14:19 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-11 14:16 [PATCH 00/25] perf tools: Introduce an abstraction for Instruction Tracing Adrian Hunter
2014-11-11 14:16 ` [PATCH 01/25] perf tools: Do not poll events that use the system_wide flag Adrian Hunter
2014-11-20 7:40 ` [tip:perf/core] perf evlist: " tip-bot for Adrian Hunter
2014-11-11 14:16 ` [PATCH 02/25] perf tools: Add perf-read-vdso32 and perf-read-vdsox32 to .gitignore Adrian Hunter
2014-11-20 7:40 ` [tip:perf/core] " tip-bot for Adrian Hunter
2014-11-11 14:16 ` [PATCH 03/25] perf tools: Only override the default :tid comm entry Adrian Hunter
2014-11-20 7:40 ` [tip:perf/core] perf tools: Only override the default : tid " tip-bot for Adrian Hunter
2014-11-11 14:16 ` [PATCH 04/25] perf header: Add Instruction Tracing feature Adrian Hunter
2014-11-11 14:16 ` [PATCH 05/25] perf evlist: Add initial support for mmapping an Instruction Trace buffer Adrian Hunter
2014-11-11 14:16 ` [PATCH 06/25] perf tools: Add user events for Instruction Tracing Adrian Hunter
2014-11-11 14:16 ` [PATCH 07/25] perf tools: Add support for Instruction Trace recording Adrian Hunter
2014-11-11 14:16 ` [PATCH 08/25] perf record: Add basic Instruction Tracing support Adrian Hunter
2014-11-11 14:16 ` [PATCH 09/25] perf record: Extend -m option for Instruction Tracing mmap pages Adrian Hunter
2014-11-11 14:16 ` [PATCH 10/25] perf tools: Add a user event for Instruction Tracing errors Adrian Hunter
2014-11-11 14:16 ` [PATCH 11/25] perf session: Add hooks to allow transparent decoding of Instruction Tracing data Adrian Hunter
2014-11-11 14:16 ` Adrian Hunter [this message]
2014-11-11 14:16 ` [PATCH 13/25] perf itrace: Add helpers for Instruction Tracing errors Adrian Hunter
2014-11-11 14:16 ` [PATCH 14/25] perf itrace: Add helpers for queuing Instruction Tracing data Adrian Hunter
2014-11-11 14:16 ` [PATCH 15/25] perf itrace: Add a heap for sorting Instruction Tracing queues Adrian Hunter
2014-11-11 14:16 ` [PATCH 16/25] perf itrace: Add processing for Instruction Tracing events Adrian Hunter
2014-11-11 14:16 ` [PATCH 17/25] perf itrace: Add a hashtable for caching decoded instructions Adrian Hunter
2014-11-11 14:16 ` [PATCH 18/25] perf tools: Add member to struct dso for an instruction cache Adrian Hunter
2014-11-11 14:16 ` [PATCH 19/25] perf script: Add Instruction Tracing support Adrian Hunter
2014-11-11 14:16 ` [PATCH 20/25] perf script: Always allow fields 'addr' and 'cpu' for itrace Adrian Hunter
2014-11-11 14:16 ` [PATCH 21/25] perf report: Add Instruction Tracing support Adrian Hunter
2014-11-11 14:17 ` [PATCH 22/25] perf inject: Re-pipe Instruction Tracing events Adrian Hunter
2014-11-11 14:17 ` [PATCH 23/25] perf inject: Add Instruction Tracing support Adrian Hunter
2014-11-11 14:17 ` [PATCH 24/25] perf tools: Add Instruction Tracing index Adrian Hunter
2014-11-11 14:17 ` [PATCH 25/25] perf tools: Hit all build ids when Instruction Tracing Adrian Hunter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1415715423-15563-13-git-send-email-adrian.hunter@intel.com \
--to=adrian.hunter@intel.com \
--cc=acme@kernel.org \
--cc=dsahern@gmail.com \
--cc=eranian@google.com \
--cc=fweisbec@gmail.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=namhyung@gmail.com \
--cc=paulus@samba.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome