perf evsel: Add support for synthesized branch stack sample type
authorAdrian Hunter <adrian.hunter@intel.com>
Wed, 29 Apr 2020 15:07:47 +0000 (18:07 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 5 May 2020 19:35:29 +0000 (16:35 -0300)
Allow for a synthesized branch stack to be added to samples. As with
synthesized call chains, the sample type cannot be changed because it is
needed to continue to parse events. So add and use helper function
evsel__has_br_stack() to indicate a branch stack, whether original or
synthesized.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lore.kernel.org/lkml/20200429150751.12570-6-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/evsel.h
tools/perf/util/session.c

index a463bc65b001231c234414cf0d69f8d2f20c2e21..bf999e3c50c771d7a013090e9a012b7de07b3f6a 100644 (file)
@@ -417,6 +417,16 @@ static inline bool evsel__has_callchain(const struct evsel *evsel)
               evsel->synth_sample_type & PERF_SAMPLE_CALLCHAIN;
 }
 
+static inline bool evsel__has_br_stack(const struct evsel *evsel)
+{
+       /*
+        * For reporting purposes, an evsel sample can have a recorded branch
+        * stack or a branch stack synthesized from AUX area data.
+        */
+       return evsel->core.attr.sample_type & PERF_SAMPLE_BRANCH_STACK ||
+              evsel->synth_sample_type & PERF_SAMPLE_BRANCH_STACK;
+}
+
 struct perf_env *perf_evsel__env(struct evsel *evsel);
 
 int perf_evsel__store_ids(struct evsel *evsel, struct evlist *evlist);
index 0b0bfe5bef17cd8cb86029e6aca07f9dccc0c72b..2b5a08a92ce5c2c752764a80838fbd6589d9a67f 100644 (file)
@@ -1243,7 +1243,7 @@ static void dump_sample(struct evsel *evsel, union perf_event *event,
        if (evsel__has_callchain(evsel))
                callchain__printf(evsel, sample);
 
-       if (sample_type & PERF_SAMPLE_BRANCH_STACK)
+       if (evsel__has_br_stack(evsel))
                branch_stack__printf(sample, perf_evsel__has_branch_callstack(evsel));
 
        if (sample_type & PERF_SAMPLE_REGS_USER)