| From foo@baz Mon Sep 17 12:33:31 CEST 2018 |
| From: Kan Liang <kan.liang@linux.intel.com> |
| Date: Mon, 9 Jul 2018 07:15:22 -0700 |
| Subject: perf evlist: Fix error out while applying initial delay and LBR |
| |
| From: Kan Liang <kan.liang@linux.intel.com> |
| |
| [ Upstream commit 95035c5e167ae6e740b1ddd30210ae0eaf39a5db ] |
| |
| 'perf record' will error out if both --delay and LBR are applied. |
| |
| For example: |
| |
| # perf record -D 1000 -a -e cycles -j any -- sleep 2 |
| Error: |
| dummy:HG: PMU Hardware doesn't support sampling/overflow-interrupts. |
| Try 'perf stat' |
| # |
| |
| A dummy event is added implicitly for initial delay, which has the same |
| configurations as real sampling events. The dummy event is a software |
| event. If LBR is configured, perf must error out. |
| |
| The dummy event will only be used to track PERF_RECORD_MMAP while perf |
| waits for the initial delay to enable the real events. The BRANCH_STACK |
| bit can be safely cleared for the dummy event. |
| |
| After applying the patch: |
| |
| # perf record -D 1000 -a -e cycles -j any -- sleep 2 |
| [ perf record: Woken up 1 times to write data ] |
| [ perf record: Captured and wrote 1.054 MB perf.data (828 samples) ] |
| # |
| |
| Reported-by: Sunil K Pandey <sunil.k.pandey@intel.com> |
| Signed-off-by: Kan Liang <kan.liang@linux.intel.com> |
| Acked-by: Jiri Olsa <jolsa@kernel.org> |
| Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Cc: Andi Kleen <ak@linux.intel.com> |
| Cc: Namhyung Kim <namhyung@kernel.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Link: http://lkml.kernel.org/r/1531145722-16404-1-git-send-email-kan.liang@linux.intel.com |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| tools/perf/util/evsel.c | 14 ++++++++++++++ |
| 1 file changed, 14 insertions(+) |
| |
| --- a/tools/perf/util/evsel.c |
| +++ b/tools/perf/util/evsel.c |
| @@ -824,6 +824,12 @@ static void apply_config_terms(struct pe |
| } |
| } |
| |
| +static bool is_dummy_event(struct perf_evsel *evsel) |
| +{ |
| + return (evsel->attr.type == PERF_TYPE_SOFTWARE) && |
| + (evsel->attr.config == PERF_COUNT_SW_DUMMY); |
| +} |
| + |
| /* |
| * The enable_on_exec/disabled value strategy: |
| * |
| @@ -1054,6 +1060,14 @@ void perf_evsel__config(struct perf_evse |
| else |
| perf_evsel__reset_sample_bit(evsel, PERIOD); |
| } |
| + |
| + /* |
| + * For initial_delay, a dummy event is added implicitly. |
| + * The software event will trigger -EOPNOTSUPP error out, |
| + * if BRANCH_STACK bit is set. |
| + */ |
| + if (opts->initial_delay && is_dummy_event(evsel)) |
| + perf_evsel__reset_sample_bit(evsel, BRANCH_STACK); |
| } |
| |
| static int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads) |