* [PATCH v1] perf pmus: Add placeholder core PMU
@ 2023-06-27 18:28 Ian Rogers
2023-06-28 3:01 ` Yang Jihong
0 siblings, 1 reply; 3+ messages in thread
From: Ian Rogers @ 2023-06-27 18:28 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
Ian Rogers, Adrian Hunter, Kan Liang, James Clark,
Suzuki Poulouse, Rob Herring, Ravi Bangoria, linux-perf-users,
linux-kernel, Yang Jihong
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;
--
2.41.0.162.gfafddb0af9-goog
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH v1] perf pmus: Add placeholder core PMU
2023-06-27 18:28 [PATCH v1] perf pmus: Add placeholder core PMU Ian Rogers
@ 2023-06-28 3:01 ` Yang Jihong
2023-06-28 20:05 ` Namhyung Kim
0 siblings, 1 reply; 3+ messages in thread
From: Yang Jihong @ 2023-06-28 3:01 UTC (permalink / raw)
To: Ian Rogers, Peter Zijlstra, Ingo Molnar,
Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin,
Jiri Olsa, Namhyung Kim, Adrian Hunter, Kan Liang, James Clark,
Suzuki Poulouse, Rob Herring, Ravi Bangoria, linux-perf-users,
linux-kernel
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
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH v1] perf pmus: Add placeholder core PMU
2023-06-28 3:01 ` Yang Jihong
@ 2023-06-28 20:05 ` Namhyung Kim
0 siblings, 0 replies; 3+ messages in thread
From: Namhyung Kim @ 2023-06-28 20:05 UTC (permalink / raw)
To: Yang Jihong
Cc: Ian Rogers, Peter Zijlstra, Ingo Molnar,
Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin,
Jiri Olsa, Adrian Hunter, Kan Liang, James Clark,
Suzuki Poulouse, Rob Herring, Ravi Bangoria, linux-perf-users,
linux-kernel
On Tue, Jun 27, 2023 at 8:01 PM Yang Jihong <yangjihong1@huawei.com> wrote:
>
> 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>
Applied to perf-tools-next, thanks!
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-06-28 20:05 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-27 18:28 [PATCH v1] perf pmus: Add placeholder core PMU Ian Rogers
2023-06-28 3:01 ` Yang Jihong
2023-06-28 20:05 ` Namhyung Kim
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®