[PATCH v0 52/71] perf itrace: Add processing for Instruction Tracing events

From: Alexander Shishkin
Date: Wed Dec 11 2013 - 07:42:25 EST


From: Adrian Hunter <adrian.hunter@xxxxxxxxx>

Provide hooks so that an Instruction Trace
decoder can process Instruction Tracing
events.

Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>
---
tools/perf/util/itrace.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/itrace.h | 13 ++++++++++++
2 files changed, 65 insertions(+)

diff --git a/tools/perf/util/itrace.c b/tools/perf/util/itrace.c
index 44214bc..91f1fb5 100644
--- a/tools/perf/util/itrace.c
+++ b/tools/perf/util/itrace.c
@@ -579,6 +579,31 @@ out_free:
return err;
}

+static bool itrace__dont_decode(struct perf_session *session)
+{
+ return !session->itrace_synth_opts ||
+ session->itrace_synth_opts->dont_decode;
+}
+
+int perf_event__process_itrace_info(struct perf_tool *tool __maybe_unused,
+ union perf_event *event,
+ struct perf_session *session __maybe_unused)
+{
+ enum itrace_type type = event->itrace_info.type;
+
+ if (dump_trace)
+ fprintf(stdout, " type: %u\n", type);
+
+ if (itrace__dont_decode(session))
+ return 0;
+
+ switch (type) {
+ case PERF_ITRACE_UNKNOWN:
+ default:
+ return -EINVAL;
+ }
+}
+
int perf_event__synthesize_itrace(struct perf_tool *tool,
perf_event__handler_t process,
size_t size, u64 offset, u64 ref, int idx,
@@ -599,6 +624,30 @@ int perf_event__synthesize_itrace(struct perf_tool *tool,
return process(tool, &ev, NULL, NULL);
}

+s64 perf_event__process_itrace(struct perf_tool *tool, union perf_event *event,
+ struct perf_session *session)
+{
+ s64 err;
+
+ if (dump_trace)
+ fprintf(stdout, " size: %"PRIu64" offset: %"PRIx64" ref: %"PRIx64" idx: %u tid: %d cpu: %d\n",
+ event->itrace.size, event->itrace.offset,
+ event->itrace.reference, event->itrace.idx,
+ event->itrace.tid, event->itrace.cpu);
+
+ if (itrace__dont_decode(session))
+ return event->itrace.size;
+
+ if (!session->itrace || event->header.type != PERF_RECORD_ITRACE)
+ return -EINVAL;
+
+ err = session->itrace->process_itrace_event(session, event, tool);
+ if (err < 0)
+ return err;
+
+ return event->itrace.size;
+}
+
#define PERF_ITRACE_DEFAULT_PERIOD_TYPE PERF_ITRACE_PERIOD_INSTRUCTIONS
#define PERF_ITRACE_DEFAULT_PERIOD 1000

@@ -713,6 +762,9 @@ int perf_event__process_itrace_error(struct perf_tool *tool __maybe_unused,
union perf_event *event,
struct perf_session *session)
{
+ if (itrace__dont_decode(session))
+ return 0;
+
if (session->itrace)
session->itrace->error_count += 1;

diff --git a/tools/perf/util/itrace.h b/tools/perf/util/itrace.h
index 304d377..ec3b78a 100644
--- a/tools/perf/util/itrace.h
+++ b/tools/perf/util/itrace.h
@@ -38,6 +38,10 @@ struct option;
struct perf_record_opts;
struct itrace_info_event;

+enum itrace_type {
+ PERF_ITRACE_UNKNOWN,
+};
+
enum itrace_error_type {
PERF_ITRACE_DECODER_ERROR = 1,
};
@@ -76,6 +80,9 @@ struct itrace {
union perf_event *event,
struct perf_sample *sample,
struct perf_tool *tool);
+ int (*process_itrace_event)(struct perf_session *session,
+ union perf_event *event,
+ struct perf_tool *tool);
int (*flush_events)(struct perf_session *session,
struct perf_tool *tool);
void (*free_events)(struct perf_session *session);
@@ -316,10 +323,16 @@ int perf_event__synthesize_itrace_info(struct itrace_record *itr,
struct perf_tool *tool,
struct perf_session *session,
perf_event__handler_t process);
+int perf_event__process_itrace_info(struct perf_tool *tool,
+ union perf_event *event,
+ struct perf_session *session);
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);
+s64 perf_event__process_itrace(struct perf_tool *tool,
+ union perf_event *event,
+ struct perf_session *session);
int perf_event__process_itrace_error(struct perf_tool *tool,
union perf_event *event,
struct perf_session *session);
--
1.8.5.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/