[RFC PATCH v5 01/16] perf stat: Add new field in stat_config to enable hardware aware grouping.

weilin.wang@intel.com posted 16 patches 1 year, 8 months ago
[RFC PATCH v5 01/16] perf stat: Add new field in stat_config to enable hardware aware grouping.
Posted by weilin.wang@intel.com 1 year, 8 months ago
From: Weilin Wang <weilin.wang@intel.com>

Hardware counter and event information could be used to help creating event
groups that better utilize hardware counters and improve multiplexing.

Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Weilin Wang <weilin.wang@intel.com>
---
 tools/perf/builtin-stat.c     | 5 +++++
 tools/perf/util/metricgroup.c | 5 +++++
 tools/perf/util/metricgroup.h | 1 +
 tools/perf/util/stat.h        | 1 +
 4 files changed, 12 insertions(+)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 6bba1a89d030..c4a5f0984295 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -2106,6 +2106,7 @@ static int add_default_attributes(void)
 						stat_config.metric_no_threshold,
 						stat_config.user_requested_cpu_list,
 						stat_config.system_wide,
+						stat_config.hardware_aware_grouping,
 						&stat_config.metric_events);
 	}
 
@@ -2139,6 +2140,7 @@ static int add_default_attributes(void)
 						stat_config.metric_no_threshold,
 						stat_config.user_requested_cpu_list,
 						stat_config.system_wide,
+						stat_config.hardware_aware_grouping,
 						&stat_config.metric_events);
 	}
 
@@ -2173,6 +2175,7 @@ static int add_default_attributes(void)
 						/*metric_no_threshold=*/true,
 						stat_config.user_requested_cpu_list,
 						stat_config.system_wide,
+						stat_config.hardware_aware_grouping,
 						&stat_config.metric_events) < 0)
 			return -1;
 	}
@@ -2214,6 +2217,7 @@ static int add_default_attributes(void)
 							/*metric_no_threshold=*/true,
 							stat_config.user_requested_cpu_list,
 							stat_config.system_wide,
+							stat_config.hardware_aware_grouping,
 							&stat_config.metric_events) < 0)
 				return -1;
 
@@ -2748,6 +2752,7 @@ int cmd_stat(int argc, const char **argv)
 						stat_config.metric_no_threshold,
 						stat_config.user_requested_cpu_list,
 						stat_config.system_wide,
+						stat_config.hardware_aware_grouping,
 						&stat_config.metric_events);
 
 		zfree(&metrics);
diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
index 79ef6095ab28..11613450725a 100644
--- a/tools/perf/util/metricgroup.c
+++ b/tools/perf/util/metricgroup.c
@@ -1690,12 +1690,17 @@ int metricgroup__parse_groups(struct evlist *perf_evlist,
 			      bool metric_no_threshold,
 			      const char *user_requested_cpu_list,
 			      bool system_wide,
+			      bool hardware_aware_grouping,
 			      struct rblist *metric_events)
 {
 	const struct pmu_metrics_table *table = pmu_metrics_table__find();
 
 	if (!table)
 		return -EINVAL;
+	if (hardware_aware_grouping) {
+		pr_debug("Use hardware aware grouping instead of traditional metric grouping method\n");
+	}
+
 
 	return parse_groups(perf_evlist, pmu, str, metric_no_group, metric_no_merge,
 			    metric_no_threshold, user_requested_cpu_list, system_wide,
diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h
index d5325c6ec8e1..779f6ede1b51 100644
--- a/tools/perf/util/metricgroup.h
+++ b/tools/perf/util/metricgroup.h
@@ -77,6 +77,7 @@ int metricgroup__parse_groups(struct evlist *perf_evlist,
 			      bool metric_no_threshold,
 			      const char *user_requested_cpu_list,
 			      bool system_wide,
+			      bool hardware_aware_grouping,
 			      struct rblist *metric_events);
 int metricgroup__parse_groups_test(struct evlist *evlist,
 				   const struct pmu_metrics_table *table,
diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
index d6e5c8787ba2..fd7a187551bd 100644
--- a/tools/perf/util/stat.h
+++ b/tools/perf/util/stat.h
@@ -87,6 +87,7 @@ struct perf_stat_config {
 	bool			 metric_no_group;
 	bool			 metric_no_merge;
 	bool			 metric_no_threshold;
+	bool			 hardware_aware_grouping;
 	bool			 stop_read_counter;
 	bool			 iostat_run;
 	char			 *user_requested_cpu_list;
-- 
2.42.0
Re: [RFC PATCH v5 01/16] perf stat: Add new field in stat_config to enable hardware aware grouping.
Posted by Ian Rogers 1 year, 8 months ago
On Fri, Apr 12, 2024 at 2:08 PM <weilin.wang@intel.com> wrote:
>
> From: Weilin Wang <weilin.wang@intel.com>
>
> Hardware counter and event information could be used to help creating event
> groups that better utilize hardware counters and improve multiplexing.
>
> Reviewed-by: Ian Rogers <irogers@google.com>
> Signed-off-by: Weilin Wang <weilin.wang@intel.com>
> ---
>  tools/perf/builtin-stat.c     | 5 +++++
>  tools/perf/util/metricgroup.c | 5 +++++
>  tools/perf/util/metricgroup.h | 1 +
>  tools/perf/util/stat.h        | 1 +
>  4 files changed, 12 insertions(+)
>
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index 6bba1a89d030..c4a5f0984295 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -2106,6 +2106,7 @@ static int add_default_attributes(void)
>                                                 stat_config.metric_no_threshold,
>                                                 stat_config.user_requested_cpu_list,
>                                                 stat_config.system_wide,
> +                                               stat_config.hardware_aware_grouping,
>                                                 &stat_config.metric_events);
>         }
>
> @@ -2139,6 +2140,7 @@ static int add_default_attributes(void)
>                                                 stat_config.metric_no_threshold,
>                                                 stat_config.user_requested_cpu_list,
>                                                 stat_config.system_wide,
> +                                               stat_config.hardware_aware_grouping,
>                                                 &stat_config.metric_events);
>         }
>
> @@ -2173,6 +2175,7 @@ static int add_default_attributes(void)
>                                                 /*metric_no_threshold=*/true,
>                                                 stat_config.user_requested_cpu_list,
>                                                 stat_config.system_wide,
> +                                               stat_config.hardware_aware_grouping,
>                                                 &stat_config.metric_events) < 0)
>                         return -1;
>         }
> @@ -2214,6 +2217,7 @@ static int add_default_attributes(void)
>                                                         /*metric_no_threshold=*/true,
>                                                         stat_config.user_requested_cpu_list,
>                                                         stat_config.system_wide,
> +                                                       stat_config.hardware_aware_grouping,
>                                                         &stat_config.metric_events) < 0)
>                                 return -1;
>
> @@ -2748,6 +2752,7 @@ int cmd_stat(int argc, const char **argv)
>                                                 stat_config.metric_no_threshold,
>                                                 stat_config.user_requested_cpu_list,
>                                                 stat_config.system_wide,
> +                                               stat_config.hardware_aware_grouping,
>                                                 &stat_config.metric_events);
>
>                 zfree(&metrics);
> diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
> index 79ef6095ab28..11613450725a 100644
> --- a/tools/perf/util/metricgroup.c
> +++ b/tools/perf/util/metricgroup.c
> @@ -1690,12 +1690,17 @@ int metricgroup__parse_groups(struct evlist *perf_evlist,
>                               bool metric_no_threshold,
>                               const char *user_requested_cpu_list,
>                               bool system_wide,
> +                             bool hardware_aware_grouping,
>                               struct rblist *metric_events)
>  {
>         const struct pmu_metrics_table *table = pmu_metrics_table__find();
>
>         if (!table)
>                 return -EINVAL;
> +       if (hardware_aware_grouping) {
> +               pr_debug("Use hardware aware grouping instead of traditional metric grouping method\n");
> +       }

nit: single line if statements shouldn't have curlies:
https://www.kernel.org/doc/html/v6.8/process/coding-style.html#placing-braces-and-spaces

Thanks,
Ian

> +
>
>         return parse_groups(perf_evlist, pmu, str, metric_no_group, metric_no_merge,
>                             metric_no_threshold, user_requested_cpu_list, system_wide,
> diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h
> index d5325c6ec8e1..779f6ede1b51 100644
> --- a/tools/perf/util/metricgroup.h
> +++ b/tools/perf/util/metricgroup.h
> @@ -77,6 +77,7 @@ int metricgroup__parse_groups(struct evlist *perf_evlist,
>                               bool metric_no_threshold,
>                               const char *user_requested_cpu_list,
>                               bool system_wide,
> +                             bool hardware_aware_grouping,
>                               struct rblist *metric_events);
>  int metricgroup__parse_groups_test(struct evlist *evlist,
>                                    const struct pmu_metrics_table *table,
> diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
> index d6e5c8787ba2..fd7a187551bd 100644
> --- a/tools/perf/util/stat.h
> +++ b/tools/perf/util/stat.h
> @@ -87,6 +87,7 @@ struct perf_stat_config {
>         bool                     metric_no_group;
>         bool                     metric_no_merge;
>         bool                     metric_no_threshold;
> +       bool                     hardware_aware_grouping;
>         bool                     stop_read_counter;
>         bool                     iostat_run;
>         char                     *user_requested_cpu_list;
> --
> 2.42.0
>
Re: [RFC PATCH v5 01/16] perf stat: Add new field in stat_config to enable hardware aware grouping.
Posted by Arnaldo Carvalho de Melo 1 year, 8 months ago
On Tue, Apr 16, 2024 at 08:49:21PM -0700, Ian Rogers wrote:
> On Fri, Apr 12, 2024 at 2:08 PM <weilin.wang@intel.com> wrote:
> >
> > From: Weilin Wang <weilin.wang@intel.com>
> >
> > Hardware counter and event information could be used to help creating event
> > groups that better utilize hardware counters and improve multiplexing.
> >
> > Reviewed-by: Ian Rogers <irogers@google.com>
> > Signed-off-by: Weilin Wang <weilin.wang@intel.com>
> > ---
> >  tools/perf/builtin-stat.c     | 5 +++++
> >  tools/perf/util/metricgroup.c | 5 +++++
> >  tools/perf/util/metricgroup.h | 1 +
> >  tools/perf/util/stat.h        | 1 +
> >  4 files changed, 12 insertions(+)
> >
> > diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> > index 6bba1a89d030..c4a5f0984295 100644
> > --- a/tools/perf/builtin-stat.c
> > +++ b/tools/perf/builtin-stat.c
> > @@ -2106,6 +2106,7 @@ static int add_default_attributes(void)
> >                                                 stat_config.metric_no_threshold,
> >                                                 stat_config.user_requested_cpu_list,
> >                                                 stat_config.system_wide,
> > +                                               stat_config.hardware_aware_grouping,
> >                                                 &stat_config.metric_events);
> >         }
> >
> > @@ -2139,6 +2140,7 @@ static int add_default_attributes(void)
> >                                                 stat_config.metric_no_threshold,
> >                                                 stat_config.user_requested_cpu_list,
> >                                                 stat_config.system_wide,
> > +                                               stat_config.hardware_aware_grouping,
> >                                                 &stat_config.metric_events);
> >         }
> >
> > @@ -2173,6 +2175,7 @@ static int add_default_attributes(void)
> >                                                 /*metric_no_threshold=*/true,
> >                                                 stat_config.user_requested_cpu_list,
> >                                                 stat_config.system_wide,
> > +                                               stat_config.hardware_aware_grouping,
> >                                                 &stat_config.metric_events) < 0)
> >                         return -1;
> >         }
> > @@ -2214,6 +2217,7 @@ static int add_default_attributes(void)
> >                                                         /*metric_no_threshold=*/true,
> >                                                         stat_config.user_requested_cpu_list,
> >                                                         stat_config.system_wide,
> > +                                                       stat_config.hardware_aware_grouping,
> >                                                         &stat_config.metric_events) < 0)
> >                                 return -1;
> >
> > @@ -2748,6 +2752,7 @@ int cmd_stat(int argc, const char **argv)
> >                                                 stat_config.metric_no_threshold,
> >                                                 stat_config.user_requested_cpu_list,
> >                                                 stat_config.system_wide,
> > +                                               stat_config.hardware_aware_grouping,
> >                                                 &stat_config.metric_events);
> >
> >                 zfree(&metrics);
> > diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
> > index 79ef6095ab28..11613450725a 100644
> > --- a/tools/perf/util/metricgroup.c
> > +++ b/tools/perf/util/metricgroup.c
> > @@ -1690,12 +1690,17 @@ int metricgroup__parse_groups(struct evlist *perf_evlist,
> >                               bool metric_no_threshold,
> >                               const char *user_requested_cpu_list,
> >                               bool system_wide,
> > +                             bool hardware_aware_grouping,
> >                               struct rblist *metric_events)
> >  {
> >         const struct pmu_metrics_table *table = pmu_metrics_table__find();
> >
> >         if (!table)
> >                 return -EINVAL;
> > +       if (hardware_aware_grouping) {
> > +               pr_debug("Use hardware aware grouping instead of traditional metric grouping method\n");
> > +       }
> 
> nit: single line if statements shouldn't have curlies:
> https://www.kernel.org/doc/html/v6.8/process/coding-style.html#placing-braces-and-spaces

Fixed  this while applying this patch.

- Arnaldo