| From 04d83662756415e43006e17d0e5844e03aef1803 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 14 Apr 2022 20:32:01 +0800 |
| Subject: perf report: Set PERF_SAMPLE_DATA_SRC bit for Arm SPE event |
| |
| From: Leo Yan <leo.yan@linaro.org> |
| |
| [ Upstream commit ccb17caecfbd542f49a2a79ae088136ba8bfb794 ] |
| |
| Since commit bb30acae4c4dacfa ("perf report: Bail out --mem-mode if mem |
| info is not available") "perf mem report" and "perf report --mem-mode" |
| don't report result if the PERF_SAMPLE_DATA_SRC bit is missed in sample |
| type. |
| |
| The commit ffab487052054162 ("perf: arm-spe: Fix perf report |
| --mem-mode") partially fixes the issue. It adds PERF_SAMPLE_DATA_SRC |
| bit for Arm SPE event, this allows the perf data file generated by |
| kernel v5.18-rc1 or later version can be reported properly. |
| |
| On the other hand, perf tool still fails to be backward compatibility |
| for a data file recorded by an older version's perf which contains Arm |
| SPE trace data. This patch is a workaround in reporting phase, when |
| detects ARM SPE PMU event and without PERF_SAMPLE_DATA_SRC bit, it will |
| force to set the bit in the sample type and give a warning info. |
| |
| Fixes: bb30acae4c4dacfa ("perf report: Bail out --mem-mode if mem info is not available") |
| Reviewed-by: James Clark <james.clark@arm.com> |
| Signed-off-by: Leo Yan <leo.yan@linaro.org> |
| Tested-by: German Gomez <german.gomez@arm.com> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Ingo Molnar <mingo@redhat.com> |
| Cc: Jiri Olsa <jolsa@kernel.org> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Cc: Namhyung Kim <namhyung@kernel.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com> |
| Link: https://lore.kernel.org/r/20220414123201.842754-1-leo.yan@linaro.org |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/perf/builtin-report.c | 14 ++++++++++++++ |
| 1 file changed, 14 insertions(+) |
| |
| diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c |
| index 91cab5cdfbc1..b55ee073c2f7 100644 |
| --- a/tools/perf/builtin-report.c |
| +++ b/tools/perf/builtin-report.c |
| @@ -340,6 +340,7 @@ static int report__setup_sample_type(struct report *rep) |
| struct perf_session *session = rep->session; |
| u64 sample_type = evlist__combined_sample_type(session->evlist); |
| bool is_pipe = perf_data__is_pipe(session->data); |
| + struct evsel *evsel; |
| |
| if (session->itrace_synth_opts->callchain || |
| session->itrace_synth_opts->add_callchain || |
| @@ -394,6 +395,19 @@ static int report__setup_sample_type(struct report *rep) |
| } |
| |
| if (sort__mode == SORT_MODE__MEMORY) { |
| + /* |
| + * FIXUP: prior to kernel 5.18, Arm SPE missed to set |
| + * PERF_SAMPLE_DATA_SRC bit in sample type. For backward |
| + * compatibility, set the bit if it's an old perf data file. |
| + */ |
| + evlist__for_each_entry(session->evlist, evsel) { |
| + if (strstr(evsel->name, "arm_spe") && |
| + !(sample_type & PERF_SAMPLE_DATA_SRC)) { |
| + evsel->core.attr.sample_type |= PERF_SAMPLE_DATA_SRC; |
| + sample_type |= PERF_SAMPLE_DATA_SRC; |
| + } |
| + } |
| + |
| if (!is_pipe && !(sample_type & PERF_SAMPLE_DATA_SRC)) { |
| ui__error("Selected --mem-mode but no mem data. " |
| "Did you call perf record without -d?\n"); |
| -- |
| 2.35.1 |
| |