[PATCH V5 13/25] perf itrace: Add processing for Instruction Tracing events

From: Adrian Hunter
Date: Sat Mar 07 2015 - 16:13:21 EST


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 | 51 +++++++++++++++++++++++++++++++++++++++++++++++-
tools/perf/util/itrace.h | 13 ++++++++++++
2 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/itrace.c b/tools/perf/util/itrace.c
index 90913fe..a2b6dd8 100644
--- a/tools/perf/util/itrace.c
+++ b/tools/perf/util/itrace.c
@@ -602,6 +602,28 @@ 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);
+
+ 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,
@@ -622,6 +644,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: %#"PRIx64" 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_NANOSECS
#define PERF_ITRACE_DEFAULT_PERIOD 100000
#define PERF_ITRACE_DEFAULT_CALLCHAIN_SZ 16
@@ -765,8 +811,11 @@ size_t perf_event__fprintf_itrace_error(union perf_event *event, FILE *fp)

int perf_event__process_itrace_error(struct perf_tool *tool __maybe_unused,
union perf_event *event,
- struct perf_session *session __maybe_unused)
+ struct perf_session *session)
{
+ if (itrace__dont_decode(session))
+ return 0;
+
perf_event__fprintf_itrace_error(event, stdout);
return 0;
}
diff --git a/tools/perf/util/itrace.h b/tools/perf/util/itrace.h
index 3b9b7fb..eca0861 100644
--- a/tools/perf/util/itrace.h
+++ b/tools/perf/util/itrace.h
@@ -34,6 +34,10 @@ struct option;
struct record_opts;
struct itrace_info_event;

+enum itrace_type {
+ PERF_ITRACE_UNKNOWN,
+};
+
enum itrace_error_type {
PERF_ITRACE_DECODER_ERROR = 1,
};
@@ -89,6 +93,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);
@@ -328,10 +335,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.9.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/