perf mem: Support AUX trace
authorLeo Yan <leo.yan@linaro.org>
Fri, 6 Nov 2020 09:48:51 +0000 (17:48 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 11 Nov 2020 15:25:45 +0000 (12:25 -0300)
The 'perf mem' tool doesn't support AUX trace data so it cannot receive
the hardware tracing data.

On arm64, although it doesn't support PMU events for memory load and
store, ARM SPE is a good candidate for memory profiling, the hardware
tracer can record memory accessing operations with affiliated
information (e.g. physical address and virtual address for accessing,
cache levels, TLB walking, latency, etc).

To allow "perf mem" tool to support AUX trace, this patch adds the AUX
callbacks for session structure; make itrace memory event as default for
"perf mem", this tells the AUX trace decoder to synthesize memory
samples.

Signed-off-by: Leo Yan <leo.yan@linaro.org>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Link: https://lore.kernel.org/r/20201106094853.21082-8-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-mem.c

index 72ce4b8fbb0f4656521c5c68bec7f05f88290678..fdfbff7592f4343dce3ee698558d55a14b895ffe 100644 (file)
@@ -7,6 +7,7 @@
 #include "perf.h"
 
 #include <subcmd/parse-options.h>
+#include "util/auxtrace.h"
 #include "util/trace-event.h"
 #include "util/tool.h"
 #include "util/session.h"
@@ -255,6 +256,12 @@ static int process_sample_event(struct perf_tool *tool,
 
 static int report_raw_events(struct perf_mem *mem)
 {
+       struct itrace_synth_opts itrace_synth_opts = {
+               .set = true,
+               .mem = true,    /* Only enable memory event */
+               .default_no_sample = true,
+       };
+
        struct perf_data data = {
                .path  = input_name,
                .mode  = PERF_DATA_MODE_READ,
@@ -267,6 +274,8 @@ static int report_raw_events(struct perf_mem *mem)
        if (IS_ERR(session))
                return PTR_ERR(session);
 
+       session->itrace_synth_opts = &itrace_synth_opts;
+
        if (mem->cpu_list) {
                ret = perf_session__cpu_bitmap(session, mem->cpu_list,
                                               mem->cpu_bitmap);
@@ -410,8 +419,12 @@ int cmd_mem(int argc, const char **argv)
                        .comm           = perf_event__process_comm,
                        .lost           = perf_event__process_lost,
                        .fork           = perf_event__process_fork,
+                       .attr           = perf_event__process_attr,
                        .build_id       = perf_event__process_build_id,
                        .namespaces     = perf_event__process_namespaces,
+                       .auxtrace_info  = perf_event__process_auxtrace_info,
+                       .auxtrace       = perf_event__process_auxtrace,
+                       .auxtrace_error = perf_event__process_auxtrace_error,
                        .ordered_events = true,
                },
                .input_name              = "perf.data",