[PATCH] perf stat: Fix uniquify for hybrid systems

Thomas Falcon posted 1 patch 11 months, 1 week ago
tools/perf/util/stat-display.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
[PATCH] perf stat: Fix uniquify for hybrid systems
Posted by Thomas Falcon 11 months, 1 week ago
Currently, perf stat is omitting the pmu name for legacy events
on hybrid systems. git bisect indicated commit 357b965deba9 as the cause:

Bisecting: 0 revisions left to test after this (roughly 0 steps)
[357b965deba9fb71467413e473764ec4e1694d8d] perf stat: Changes to event
name uniquification

Include an additional check for hybrid architectures when determining
whether to uniquify legacy events.

Before:

$ sudo ./perf stat -e cycles -a sleep 1

 Performance counter stats for 'system wide':

       173,903,751      cycles
       666,423,950      cycles

       1.006615048 seconds time elapsed

After:

$ sudo ./perf stat -e cycles -a sleep 1

 Performance counter stats for 'system wide':

       841,496,603      cpu_atom/cycles/
     3,308,929,412      cpu_core/cycles/

       1.002483283 seconds time elapsed

Fixes: 357b965deba9 ("perf stat: Changes to event name uniquification")
Signed-off-by: Thomas Falcon <thomas.falcon@intel.com>
---
 tools/perf/util/stat-display.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
index e65c7e9f15d1..df9f68080ec9 100644
--- a/tools/perf/util/stat-display.c
+++ b/tools/perf/util/stat-display.c
@@ -1676,6 +1676,7 @@ static bool evlist__disable_uniquify(const struct evlist *evlist)
 
 static void evsel__set_needs_uniquify(struct evsel *counter, const struct perf_stat_config *config)
 {
+	bool hybrid = (!config->hybrid_merge && evsel__is_hybrid(counter));
 	struct evsel *evsel;
 
 	if (counter->merged_stat) {
@@ -1688,7 +1689,8 @@ static void evsel__set_needs_uniquify(struct evsel *counter, const struct perf_s
 		return;
 	}
 
-	if  (counter->core.attr.type < PERF_TYPE_MAX && counter->core.attr.type != PERF_TYPE_RAW) {
+	if (!hybrid && counter->core.attr.type < PERF_TYPE_MAX &&
+		counter->core.attr.type != PERF_TYPE_RAW) {
 		/* Legacy event, don't uniquify. */
 		return;
 	}
@@ -1705,7 +1707,7 @@ static void evsel__set_needs_uniquify(struct evsel *counter, const struct perf_s
 		return;
 	}
 
-	if (!config->hybrid_merge && evsel__is_hybrid(counter)) {
+	if (hybrid) {
 		/* Unique hybrid counters necessary. */
 		counter->needs_uniquify = true;
 		return;
-- 
2.48.1
Re: [PATCH] perf stat: Fix uniquify for hybrid systems
Posted by Namhyung Kim 11 months, 1 week ago
Hello,

On Fri, Feb 28, 2025 at 01:53:51PM -0600, Thomas Falcon wrote:
> Currently, perf stat is omitting the pmu name for legacy events
> on hybrid systems. git bisect indicated commit 357b965deba9 as the cause:
> 
> Bisecting: 0 revisions left to test after this (roughly 0 steps)
> [357b965deba9fb71467413e473764ec4e1694d8d] perf stat: Changes to event
> name uniquification
> 
> Include an additional check for hybrid architectures when determining
> whether to uniquify legacy events.
> 
> Before:
> 
> $ sudo ./perf stat -e cycles -a sleep 1
> 
>  Performance counter stats for 'system wide':
> 
>        173,903,751      cycles
>        666,423,950      cycles
> 
>        1.006615048 seconds time elapsed
> 
> After:
> 
> $ sudo ./perf stat -e cycles -a sleep 1
> 
>  Performance counter stats for 'system wide':
> 
>        841,496,603      cpu_atom/cycles/
>      3,308,929,412      cpu_core/cycles/
> 
>        1.002483283 seconds time elapsed
> 
> Fixes: 357b965deba9 ("perf stat: Changes to event name uniquification")
> Signed-off-by: Thomas Falcon <thomas.falcon@intel.com>

Thanks for the fix, but there's a similar patch in the list.
Please take a look.

https://lore.kernel.org/r/20250226145526.632380-1-james.clark@linaro.org

Thanks,
Namhyung

> ---
>  tools/perf/util/stat-display.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
> index e65c7e9f15d1..df9f68080ec9 100644
> --- a/tools/perf/util/stat-display.c
> +++ b/tools/perf/util/stat-display.c
> @@ -1676,6 +1676,7 @@ static bool evlist__disable_uniquify(const struct evlist *evlist)
>  
>  static void evsel__set_needs_uniquify(struct evsel *counter, const struct perf_stat_config *config)
>  {
> +	bool hybrid = (!config->hybrid_merge && evsel__is_hybrid(counter));
>  	struct evsel *evsel;
>  
>  	if (counter->merged_stat) {
> @@ -1688,7 +1689,8 @@ static void evsel__set_needs_uniquify(struct evsel *counter, const struct perf_s
>  		return;
>  	}
>  
> -	if  (counter->core.attr.type < PERF_TYPE_MAX && counter->core.attr.type != PERF_TYPE_RAW) {
> +	if (!hybrid && counter->core.attr.type < PERF_TYPE_MAX &&
> +		counter->core.attr.type != PERF_TYPE_RAW) {
>  		/* Legacy event, don't uniquify. */
>  		return;
>  	}
> @@ -1705,7 +1707,7 @@ static void evsel__set_needs_uniquify(struct evsel *counter, const struct perf_s
>  		return;
>  	}
>  
> -	if (!config->hybrid_merge && evsel__is_hybrid(counter)) {
> +	if (hybrid) {
>  		/* Unique hybrid counters necessary. */
>  		counter->needs_uniquify = true;
>  		return;
> -- 
> 2.48.1
>
Re: [PATCH] perf stat: Fix uniquify for hybrid systems
Posted by Falcon, Thomas 11 months, 1 week ago
On Fri, 2025-02-28 at 16:09 -0800, Namhyung Kim wrote:
> Hello,
> 
> On Fri, Feb 28, 2025 at 01:53:51PM -0600, Thomas Falcon wrote:
> > Currently, perf stat is omitting the pmu name for legacy events
> > on hybrid systems. git bisect indicated commit 357b965deba9 as the
> > cause:
> > 
> > Bisecting: 0 revisions left to test after this (roughly 0 steps)
> > [357b965deba9fb71467413e473764ec4e1694d8d] perf stat: Changes to
> > event
> > name uniquification
> > 
> > Include an additional check for hybrid architectures when
> > determining
> > whether to uniquify legacy events.
> > 
> > Before:
> > 
> > $ sudo ./perf stat -e cycles -a sleep 1
> > 
> >  Performance counter stats for 'system wide':
> > 
> >        173,903,751      cycles
> >        666,423,950      cycles
> > 
> >        1.006615048 seconds time elapsed
> > 
> > After:
> > 
> > $ sudo ./perf stat -e cycles -a sleep 1
> > 
> >  Performance counter stats for 'system wide':
> > 
> >        841,496,603      cpu_atom/cycles/
> >      3,308,929,412      cpu_core/cycles/
> > 
> >        1.002483283 seconds time elapsed
> > 
> > Fixes: 357b965deba9 ("perf stat: Changes to event name
> > uniquification")
> > Signed-off-by: Thomas Falcon <thomas.falcon@intel.com>
> 
> Thanks for the fix, but there's a similar patch in the list.
> Please take a look.
> 
> https://lore.kernel.org/r/20250226145526.632380-1-james.clark@linaro.org
> 

Will do, thanks!

Tom
> Thanks,
> Namhyung
> 
> > ---
> >  tools/perf/util/stat-display.c | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> > 
> > diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-
> > display.c
> > index e65c7e9f15d1..df9f68080ec9 100644
> > --- a/tools/perf/util/stat-display.c
> > +++ b/tools/perf/util/stat-display.c
> > @@ -1676,6 +1676,7 @@ static bool evlist__disable_uniquify(const
> > struct evlist *evlist)
> >  
> >  static void evsel__set_needs_uniquify(struct evsel *counter, const
> > struct perf_stat_config *config)
> >  {
> > +	bool hybrid = (!config->hybrid_merge &&
> > evsel__is_hybrid(counter));
> >  	struct evsel *evsel;
> >  
> >  	if (counter->merged_stat) {
> > @@ -1688,7 +1689,8 @@ static void evsel__set_needs_uniquify(struct
> > evsel *counter, const struct perf_s
> >  		return;
> >  	}
> >  
> > -	if  (counter->core.attr.type < PERF_TYPE_MAX && counter-
> > >core.attr.type != PERF_TYPE_RAW) {
> > +	if (!hybrid && counter->core.attr.type < PERF_TYPE_MAX &&
> > +		counter->core.attr.type != PERF_TYPE_RAW) {
> >  		/* Legacy event, don't uniquify. */
> >  		return;
> >  	}
> > @@ -1705,7 +1707,7 @@ static void evsel__set_needs_uniquify(struct
> > evsel *counter, const struct perf_s
> >  		return;
> >  	}
> >  
> > -	if (!config->hybrid_merge && evsel__is_hybrid(counter)) {
> > +	if (hybrid) {
> >  		/* Unique hybrid counters necessary. */
> >  		counter->needs_uniquify = true;
> >  		return;
> > -- 
> > 2.48.1
> >