mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [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®