| From 9897085e038de72c48a3f39318eaabb757bfc641 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 30 Jun 2020 16:39:33 +0300 |
| Subject: perf intel-pt: Fix recording PEBS-via-PT with registers |
| |
| From: Adrian Hunter <adrian.hunter@intel.com> |
| |
| [ Upstream commit 75bcb8776dc987538f267ba4ba05ca43fc2b1676 ] |
| |
| When recording PEBS-via-PT, the kernel will not accept the intel_pt |
| event with register sampling e.g. |
| |
| # perf record --kcore -c 10000 -e '{intel_pt/branch=0/,branch-loads/aux-output/ppp}' -I -- ls -l |
| Error: |
| intel_pt/branch=0/: PMU Hardware doesn't support sampling/overflow-interrupts. Try 'perf stat' |
| |
| Fix by suppressing register sampling on the intel_pt evsel. |
| |
| Committer notes: |
| |
| Adrian informed that this is only available from Tremont onwards, so on |
| older processors the error continues the same as before. |
| |
| Fixes: 9e64cefe4335b ("perf intel-pt: Process options for PEBS event synthesis") |
| Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: Luwei Kang <luwei.kang@intel.com> |
| Link: http://lore.kernel.org/lkml/20200630133935.11150-2-adrian.hunter@intel.com |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/perf/arch/x86/util/intel-pt.c | 1 + |
| tools/perf/util/evsel.c | 4 ++-- |
| 2 files changed, 3 insertions(+), 2 deletions(-) |
| |
| diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c |
| index d43f9dec69980..e768c02ef2ab9 100644 |
| --- a/tools/perf/arch/x86/util/intel-pt.c |
| +++ b/tools/perf/arch/x86/util/intel-pt.c |
| @@ -596,6 +596,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr, |
| } |
| evsel->core.attr.freq = 0; |
| evsel->core.attr.sample_period = 1; |
| + evsel->no_aux_samples = true; |
| intel_pt_evsel = evsel; |
| opts->full_auxtrace = true; |
| } |
| diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c |
| index abc7fda4a0fe1..a844715a352d8 100644 |
| --- a/tools/perf/util/evsel.c |
| +++ b/tools/perf/util/evsel.c |
| @@ -1028,12 +1028,12 @@ void perf_evsel__config(struct evsel *evsel, struct record_opts *opts, |
| if (callchain && callchain->enabled && !evsel->no_aux_samples) |
| perf_evsel__config_callchain(evsel, opts, callchain); |
| |
| - if (opts->sample_intr_regs) { |
| + if (opts->sample_intr_regs && !evsel->no_aux_samples) { |
| attr->sample_regs_intr = opts->sample_intr_regs; |
| perf_evsel__set_sample_bit(evsel, REGS_INTR); |
| } |
| |
| - if (opts->sample_user_regs) { |
| + if (opts->sample_user_regs && !evsel->no_aux_samples) { |
| attr->sample_regs_user |= opts->sample_user_regs; |
| perf_evsel__set_sample_bit(evsel, REGS_USER); |
| } |
| -- |
| 2.25.1 |
| |