Skip to content

Commit 6f47ed6

Browse files
namhyungacmel
authored andcommitted
perf metric: Do not free metric when failed to resolve
It's dangerous to free the original metric when it's called from resolve_metric() as it's already in the metric_list and might have other resources too. Instead, it'd better let them bail out and be released properly at the later stage. So add a check when it's called from metricgroup__add_metric() and release it. Also make sure that mp is set properly. Fixes: 83de0b7 ("perf metric: Collect referenced metrics in struct metric_ref_node") Signed-off-by: Namhyung Kim <[email protected]> Acked-by: Jiri Olsa <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Ian Rogers <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Stephane Eranian <[email protected]> Link: http://lore.kernel.org/lkml/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 27adafc commit 6f47ed6

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

tools/perf/util/metricgroup.c

+6-3
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,6 @@ static int __add_metric(struct list_head *metric_list,
672672
m->has_constraint = metric_no_group || metricgroup__has_constraint(pe);
673673
INIT_LIST_HEAD(&m->metric_refs);
674674
m->metric_refs_cnt = 0;
675-
*mp = m;
676675

677676
parent = expr_ids__alloc(ids);
678677
if (!parent) {
@@ -685,6 +684,7 @@ static int __add_metric(struct list_head *metric_list,
685684
free(m);
686685
return -ENOMEM;
687686
}
687+
*mp = m;
688688
} else {
689689
/*
690690
* We got here for the referenced metric, via the
@@ -719,8 +719,11 @@ static int __add_metric(struct list_head *metric_list,
719719
* all the metric's IDs and add it to the parent context.
720720
*/
721721
if (expr__find_other(pe->metric_expr, NULL, &m->pctx, runtime) < 0) {
722-
expr__ctx_clear(&m->pctx);
723-
free(m);
722+
if (m->metric_refs_cnt == 0) {
723+
expr__ctx_clear(&m->pctx);
724+
free(m);
725+
*mp = NULL;
726+
}
724727
return -EINVAL;
725728
}
726729

0 commit comments

Comments
 (0)