perf stat: Add new field in stat_config to enable hardware aware grouping
authorWeilin Wang <weilin.wang@intel.com>
Fri, 12 Apr 2024 21:07:41 +0000 (14:07 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 19 Apr 2024 01:22:51 +0000 (22:22 -0300)
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>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Caleb Biggers <caleb.biggers@intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Perry Taylor <perry.taylor@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Samantha Alt <samantha.alt@intel.com>
Link: https://lore.kernel.org/r/20240412210756.309828-2-weilin.wang@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-stat.c
tools/perf/util/metricgroup.c
tools/perf/util/metricgroup.h
tools/perf/util/stat.h

index 65388c57bb5d537945b6daceabe81060cde605ef..65a3dd7ffac30c229a5d4d5591756fc631d9ec6f 100644 (file)
@@ -2085,6 +2085,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);
        }
 
@@ -2118,6 +2119,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);
        }
 
@@ -2152,6 +2154,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;
        }
@@ -2193,6 +2196,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;
 
@@ -2727,6 +2731,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);
index 6ec083af14a1f747d34c1cabb199eb4f097527ba..9be40652461792b5ca25e534e6778948c9bfb568 100644 (file)
@@ -1690,12 +1690,15 @@ 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,
index d5325c6ec8e1140641f3229c5b9203b7f38b9103..779f6ede1b511456731a7fd8942efa66ee4db642 100644 (file)
@@ -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,
index d6e5c8787ba23a49ac35389794d7d2fa20450f73..fd7a187551bd1e78f342e78339a1c0359e7abe88 100644 (file)
@@ -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;