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 <namhyung@kernel.org> Acked-by: Jiri Olsa <jolsa@redhat.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Ian Rogers <irogers@google.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lore.kernel.org/lkml/20200915031819.386559-10-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
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

Lines changed: 6 additions & 3 deletions
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)