77 lines
2.7 KiB
Diff
77 lines
2.7 KiB
Diff
From 6897464a67827e592c7edfebc0505373d9a02f9e Mon Sep 17 00:00:00 2001
|
|
From: Namhyung Kim <namhyung@kernel.org>
|
|
Date: Tue, 15 Sep 2020 12:18:09 +0900
|
|
Subject: [PATCH 135/201] perf metric: Fix some memory leaks
|
|
|
|
mainline inclusion
|
|
from mainline-v5.9-rc6
|
|
commit 4f57a1ed749a81ec553d89233cab53db9365e193
|
|
category: bugfix
|
|
bugzilla: https://gitee.com/openeuler/kernel/issues/I8C0CX
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4f57a1ed749a81ec553d89233cab53db9365e193
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
I found some memory leaks while reading the metric code. Some are real
|
|
and others only occur in the error path. When it failed during metric
|
|
or event parsing, it should release all resources properly.
|
|
|
|
Fixes: b18f3e365019d ("perf stat: Support JSON metrics in perf stat")
|
|
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: John Garry <john.garry@huawei.com>
|
|
Cc: Kajol Jain <kjain@linux.ibm.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-2-namhyung@kernel.org
|
|
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
Signed-off-by: hongrongxuan <hongrongxuan@huawei.com>
|
|
---
|
|
tools/perf/util/metricgroup.c | 7 +++++--
|
|
1 file changed, 5 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
|
|
index b874343f4b45..a6cd69f4a306 100644
|
|
--- a/tools/perf/util/metricgroup.c
|
|
+++ b/tools/perf/util/metricgroup.c
|
|
@@ -536,6 +536,9 @@ void metricgroup__print(bool metrics, bool metricgroups, char *filter,
|
|
continue;
|
|
strlist__add(me->metrics, s);
|
|
}
|
|
+
|
|
+ if (!raw)
|
|
+ free(s);
|
|
}
|
|
free(omg);
|
|
}
|
|
@@ -1048,7 +1051,7 @@ static int parse_groups(struct perf_evlist *perf_evlist, const char *str,
|
|
ret = metricgroup__add_metric_list(str, metric_no_group,
|
|
&extra_events, &metric_list, map);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto out;
|
|
pr_debug("adding %s\n", extra_events.buf);
|
|
memset(&parse_error, 0, sizeof(struct parse_events_error));
|
|
ret = __parse_events(perf_evlist, extra_events.buf, &parse_error, fake_pmu);
|
|
@@ -1056,11 +1059,11 @@ static int parse_groups(struct perf_evlist *perf_evlist, const char *str,
|
|
parse_events_print_error(&parse_error, extra_events.buf);
|
|
goto out;
|
|
}
|
|
- strbuf_release(&extra_events);
|
|
ret = metricgroup__setup_events(&metric_list, metric_no_merge,
|
|
perf_evlist, metric_events);
|
|
out:
|
|
metricgroup__free_metrics(&metric_list);
|
|
+ strbuf_release(&extra_events);
|
|
return ret;
|
|
}
|
|
|
|
--
|
|
2.27.0
|
|
|