Commit 73f75fb1 authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf auxtrace: Add processing for AUX area tracing events

Provide hooks so that an AUX area decoder can process AUX area tracing
events.
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/1428594864-29309-14-git-send-email-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent f9397155
...@@ -615,6 +615,53 @@ int perf_event__synthesize_auxtrace_info(struct auxtrace_record *itr, ...@@ -615,6 +615,53 @@ int perf_event__synthesize_auxtrace_info(struct auxtrace_record *itr,
return err; return err;
} }
static bool auxtrace__dont_decode(struct perf_session *session)
{
return !session->itrace_synth_opts ||
session->itrace_synth_opts->dont_decode;
}
int perf_event__process_auxtrace_info(struct perf_tool *tool __maybe_unused,
union perf_event *event,
struct perf_session *session __maybe_unused)
{
enum auxtrace_type type = event->auxtrace_info.type;
if (dump_trace)
fprintf(stdout, " type: %u\n", type);
switch (type) {
case PERF_AUXTRACE_UNKNOWN:
default:
return -EINVAL;
}
}
s64 perf_event__process_auxtrace(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->auxtrace.size, event->auxtrace.offset,
event->auxtrace.reference, event->auxtrace.idx,
event->auxtrace.tid, event->auxtrace.cpu);
if (auxtrace__dont_decode(session))
return event->auxtrace.size;
if (!session->auxtrace || event->header.type != PERF_RECORD_AUXTRACE)
return -EINVAL;
err = session->auxtrace->process_auxtrace_event(session, event, tool);
if (err < 0)
return err;
return event->auxtrace.size;
}
#define PERF_ITRACE_DEFAULT_PERIOD_TYPE PERF_ITRACE_PERIOD_NANOSECS #define PERF_ITRACE_DEFAULT_PERIOD_TYPE PERF_ITRACE_PERIOD_NANOSECS
#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
...@@ -801,8 +848,11 @@ void events_stats__auxtrace_error_warn(const struct events_stats *stats) ...@@ -801,8 +848,11 @@ void events_stats__auxtrace_error_warn(const struct events_stats *stats)
int perf_event__process_auxtrace_error(struct perf_tool *tool __maybe_unused, int perf_event__process_auxtrace_error(struct perf_tool *tool __maybe_unused,
union perf_event *event, union perf_event *event,
struct perf_session *session __maybe_unused) struct perf_session *session)
{ {
if (auxtrace__dont_decode(session))
return 0;
perf_event__fprintf_auxtrace_error(event, stdout); perf_event__fprintf_auxtrace_error(event, stdout);
return 0; return 0;
} }
......
...@@ -36,6 +36,10 @@ struct record_opts; ...@@ -36,6 +36,10 @@ struct record_opts;
struct auxtrace_info_event; struct auxtrace_info_event;
struct events_stats; struct events_stats;
enum auxtrace_type {
PERF_AUXTRACE_UNKNOWN,
};
enum itrace_period_type { enum itrace_period_type {
PERF_ITRACE_PERIOD_INSTRUCTIONS, PERF_ITRACE_PERIOD_INSTRUCTIONS,
PERF_ITRACE_PERIOD_TICKS, PERF_ITRACE_PERIOD_TICKS,
...@@ -87,6 +91,9 @@ struct auxtrace { ...@@ -87,6 +91,9 @@ struct auxtrace {
union perf_event *event, union perf_event *event,
struct perf_sample *sample, struct perf_sample *sample,
struct perf_tool *tool); struct perf_tool *tool);
int (*process_auxtrace_event)(struct perf_session *session,
union perf_event *event,
struct perf_tool *tool);
int (*flush_events)(struct perf_session *session, int (*flush_events)(struct perf_session *session,
struct perf_tool *tool); struct perf_tool *tool);
void (*free_events)(struct perf_session *session); void (*free_events)(struct perf_session *session);
...@@ -348,6 +355,12 @@ int perf_event__synthesize_auxtrace_info(struct auxtrace_record *itr, ...@@ -348,6 +355,12 @@ int perf_event__synthesize_auxtrace_info(struct auxtrace_record *itr,
struct perf_tool *tool, struct perf_tool *tool,
struct perf_session *session, struct perf_session *session,
perf_event__handler_t process); perf_event__handler_t process);
int perf_event__process_auxtrace_info(struct perf_tool *tool,
union perf_event *event,
struct perf_session *session);
s64 perf_event__process_auxtrace(struct perf_tool *tool,
union perf_event *event,
struct perf_session *session);
int perf_event__process_auxtrace_error(struct perf_tool *tool, int perf_event__process_auxtrace_error(struct perf_tool *tool,
union perf_event *event, union perf_event *event,
struct perf_session *session); struct perf_session *session);
......
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