Messages in this thread | | | Subject | Re: [PATCH v1] perf pmus: Add placeholder core PMU | From | Yang Jihong <> | Date | Wed, 28 Jun 2023 11:01:47 +0800 |
| |
Hello,
On 2023/6/28 2:28, Ian Rogers wrote: > If loading a core PMU fails, legacy hardware/cache events may segv due > to there being no PMU. Create a placeholder empty PMU for this > case. This was discussed in: > https://lore.kernel.org/lkml/20230614151625.2077-1-yangjihong1@huawei.com/ > > Reported-by: Yang Jihong <yangjihong1@huawei.com> > Signed-off-by: Ian Rogers <irogers@google.com> > --- > tools/perf/util/pmu.c | 25 +++++++++++++++++++++++++ > tools/perf/util/pmu.h | 1 + > tools/perf/util/pmus.c | 7 ++++++- > 3 files changed, 32 insertions(+), 1 deletion(-) > > diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c > index 8d5ecd4ff1a9..7f984a7f16ca 100644 > --- a/tools/perf/util/pmu.c > +++ b/tools/perf/util/pmu.c > @@ -928,6 +928,31 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char > return NULL; > } > > +/* Creates the PMU when sysfs scanning fails. */ > +struct perf_pmu *perf_pmu__create_placeholder_core_pmu(struct list_head *core_pmus) > +{ > + struct perf_pmu *pmu = zalloc(sizeof(*pmu)); > + > + if (!pmu) > + return NULL; > + > + pmu->name = strdup("cpu"); > + if (!pmu->name) { > + free(pmu); > + return NULL; > + } > + > + pmu->is_core = true; > + pmu->type = PERF_TYPE_RAW; > + pmu->cpus = cpu_map__online(); > + > + INIT_LIST_HEAD(&pmu->format); > + INIT_LIST_HEAD(&pmu->aliases); > + INIT_LIST_HEAD(&pmu->caps); > + list_add_tail(&pmu->list, core_pmus); > + return pmu; > +} > + > void perf_pmu__warn_invalid_formats(struct perf_pmu *pmu) > { > struct perf_pmu_format *format; > diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h > index 8807a624e918..203b92860e3c 100644 > --- a/tools/perf/util/pmu.h > +++ b/tools/perf/util/pmu.h > @@ -286,6 +286,7 @@ int perf_pmu__event_source_devices_fd(void); > int perf_pmu__pathname_fd(int dirfd, const char *pmu_name, const char *filename, int flags); > > struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char *lookup_name); > +struct perf_pmu *perf_pmu__create_placeholder_core_pmu(struct list_head *core_pmus); > void perf_pmu__delete(struct perf_pmu *pmu); > > #endif /* __PMU_H */ > diff --git a/tools/perf/util/pmus.c b/tools/perf/util/pmus.c > index 0866dee3fc62..3cd9de42139e 100644 > --- a/tools/perf/util/pmus.c > +++ b/tools/perf/util/pmus.c > @@ -153,7 +153,12 @@ static void pmu_read_sysfs(bool core_only) > > closedir(dir); > if (core_only) { > - read_sysfs_core_pmus = true; > + if (!list_empty(&core_pmus)) > + read_sysfs_core_pmus = true; > + else { > + if (perf_pmu__create_placeholder_core_pmu(&core_pmus)) > + read_sysfs_core_pmus = true; > + } > } else { > read_sysfs_core_pmus = true; > read_sysfs_all_pmus = true; > Great. This patch solves the problem, the test results are shown in [1].
Tested-by: Yang Jihong <yangjihong1@huawei.com>
[1]: # perf --debug verbose=2 record true <SNIP> ------------------------------------------------------------ perf_event_attr: size 136 { sample_period, sample_freq } 4000 sample_type IP|TID|TIME|PERIOD read_format ID|LOST disabled 1 inherit 1 mmap 1 comm 1 freq 1 enable_on_exec 1 task 1 precise_ip 3 sample_id_all 1 mmap2 1 comm_exec 1 ksymbol 1 bpf_event 1 ------------------------------------------------------------ sys_perf_event_open: pid 703 cpu 0 group_fd -1 flags 0x8 sys_perf_event_open failed, error -2 decreasing precise_ip by one (2) ------------------------------------------------------------ perf_event_attr: size 136 { sample_period, sample_freq } 4000 sample_type IP|TID|TIME|PERIOD read_format ID|LOST disabled 1 inherit 1 mmap 1 comm 1 freq 1 enable_on_exec 1 task 1 precise_ip 2 sample_id_all 1 mmap2 1 comm_exec 1 ksymbol 1 bpf_event 1 ------------------------------------------------------------ sys_perf_event_open: pid 703 cpu 0 group_fd -1 flags 0x8 sys_perf_event_open failed, error -2 decreasing precise_ip by one (1) ------------------------------------------------------------ perf_event_attr: size 136 { sample_period, sample_freq } 4000 sample_type IP|TID|TIME|PERIOD read_format ID|LOST disabled 1 inherit 1 mmap 1 comm 1 freq 1 enable_on_exec 1 task 1 precise_ip 1 sample_id_all 1 mmap2 1 comm_exec 1 ksymbol 1 bpf_event 1 ------------------------------------------------------------ sys_perf_event_open: pid 703 cpu 0 group_fd -1 flags 0x8 sys_perf_event_open failed, error -2 decreasing precise_ip by one (0) ------------------------------------------------------------ perf_event_attr: size 136 { sample_period, sample_freq } 4000 sample_type IP|TID|TIME|PERIOD read_format ID|LOST disabled 1 inherit 1 mmap 1 comm 1 freq 1 enable_on_exec 1 task 1 sample_id_all 1 mmap2 1 comm_exec 1 ksymbol 1 bpf_event 1 ------------------------------------------------------------ sys_perf_event_open: pid 703 cpu 0 group_fd -1 flags 0x8 sys_perf_event_open failed, error -2 Warning: The cycles event is not supported, trying to fall back to cpu-clock-ticks ------------------------------------------------------------ perf_event_attr: type 1 size 136 { sample_period, sample_freq } 4000 sample_type IP|TID|TIME|PERIOD read_format ID|LOST disabled 1 inherit 1 mmap 1 comm 1 freq 1 enable_on_exec 1 task 1 precise_ip 3 sample_id_all 1 mmap2 1 comm_exec 1 ksymbol 1 bpf_event 1 ------------------------------------------------------------ sys_perf_event_open: pid 703 cpu 0 group_fd -1 flags 0x8 = 5 sys_perf_event_open: pid 703 cpu 1 group_fd -1 flags 0x8 = 6 sys_perf_event_open: pid 703 cpu 2 group_fd -1 flags 0x8 = 7 sys_perf_event_open: pid 703 cpu 3 group_fd -1 flags 0x8 = 9 sys_perf_event_open: pid 703 cpu 4 group_fd -1 flags 0x8 = 10 sys_perf_event_open: pid 703 cpu 5 group_fd -1 flags 0x8 = 11 sys_perf_event_open: pid 703 cpu 6 group_fd -1 flags 0x8 = 12 sys_perf_event_open: pid 703 cpu 7 group_fd -1 flags 0x8 = 13 <SNIP> [ perf record: Captured and wrote 0.006 MB perf.data (116 samples) ]
Thanks, Yang
| |