[RFC PATCH 15/25] perf stat: Add function to combine metrics for hardware-grouping

weilin.wang
2023-09-25T06:20:44Z

This function is very similar to the existing build_combined_expr_ctx(). Should
be able to reuse current function instead of adding a new one. Will fix this
later.

Signed-off-by: Weilin Wang <weilin.wang@intel.com>
---
tools/perf/util/metricgroup.c | 49 ++++++++++++++++++++++++++++++++---
1 file changed, 45 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
index 797f831e1..2e7a8e315 100644
--- a/tools/perf/util/metricgroup.c
+++ b/tools/perf/util/metricgroup.c
@@ -1432,9 +1432,49 @@ static int build_combined_expr_ctx(const struct list_head *metric_list,
return ret;
}

+/**
+ * hw_aware_build_combined_expr_ctx - Make an expr_parse_ctx with all !group_events
+ * metric IDs, as the IDs are held in a set,
+ * duplicates will be removed.
+ * @metric_list: List to take metrics from.
+ * @combined: Out argument for result.
+ */
+static int hw_aware_build_combined_expr_ctx(const struct list_head *metric_list,
+ struct expr_parse_ctx **combined)
+{
+ struct hashmap_entry *cur;
+ size_t bkt;
+ struct metric *m;
+ char *dup;
+ int ret;
+
+ *combined = expr__ctx_new();
+ if (!*combined)
+ return -ENOMEM;
+
+ list_for_each_entry(m, metric_list, nd) {
+ hashmap__for_each_entry(m->pctx->ids, cur, bkt) {
+ pr_debug2("metric: %s\n", m->metric_name);
+ dup = strdup(cur->pkey);
+ if (!dup) {
+ ret = -ENOMEM;
+ goto err_out;
+ }
+ ret = expr__add_id(*combined, dup);
+ if (ret)
+ goto err_out;
+ }
+ }
+ return 0;
+err_out:
+ expr__ctx_free(*combined);
+ *combined = NULL;
+ return ret;
+}
+
/**
* set_counter_bitmap - The counter bit mapping: [8-15,0-7], e.g. the GP0 is the
- * 8th bit and GP7 is the 1st bit in this 16-bits bitmap. The is helpful to
+ * 8th bit and GP7 is the 1st bit in this 16-bits bitmap. The is helpful to
* assign GP4-7 before GP0-3 because some events can be collected using GP0-3
* only on some platforms.
*/
@@ -1721,8 +1761,7 @@ static int metricgroup__add_pmu_layout_callback(const struct pmu_layout *pl,
* @table: pmu_layouts table that is searched for counter info.
*/
static int get_pmu_counter_layouts(struct list_head *pmu_info_list,
- const struct pmu_layouts_table
- *table)
+ const struct pmu_layouts_table *table)
{
LIST_HEAD(list);
int ret;
@@ -2142,6 +2181,8 @@ static int hw_aware_parse_ids(struct perf_pmu *fake_pmu,
*out_evlist = parsed_evlist;
parsed_evlist = NULL;
err_out:
+ parse_events_error__exit(&parse_error);
+ evlist__delete(parsed_evlist);
metricgroup__free_grouping_strs(&groupings);
return ret;
}
@@ -2264,7 +2305,7 @@ static int hw_aware_parse_groups(struct evlist *perf_evlist,
if (!metric_no_merge) {
struct expr_parse_ctx *combined = NULL;

- ret = build_combined_expr_ctx(&metric_list, &combined);
+ ret = hw_aware_build_combined_expr_ctx(&metric_list, &combined);

if (!ret && combined && hashmap__size(combined->ids)) {
ret = hw_aware_parse_ids(fake_pmu, combined,
--
2.39.3