Skip to content

Commit 3cb4d5e

Browse files
Manciukicacmel
authored andcommitted
perf trace: Free syscall tp fields in evsel->priv
ASan reports several memory leaks running: # perf test "88: Check open filename arg using perf trace + vfs_getname" The third of these leaks is related to evsel->priv fields of sycalls never being deallocated. This patch adds the function evlist__free_syscall_tp_fields which iterates over all evsels in evlist, matching syscalls, and calling the missing frees. This new function is called at the end of trace__run, right before calling evlist__delete. Signed-off-by: Riccardo Mancini <[email protected]> Cc: Ian Rogers <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Link: http://lore.kernel.org/lkml/46526611904ec5ff2768b59014e3afce8e0197d1.1626343282.git.rickyman7@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent f2ebf8f commit 3cb4d5e

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

tools/perf/builtin-trace.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3103,6 +3103,21 @@ static struct evsel *evsel__new_pgfault(u64 config)
31033103
return evsel;
31043104
}
31053105

3106+
static void evlist__free_syscall_tp_fields(struct evlist *evlist)
3107+
{
3108+
struct evsel *evsel;
3109+
3110+
evlist__for_each_entry(evlist, evsel) {
3111+
struct evsel_trace *et = evsel->priv;
3112+
3113+
if (!et || !evsel->tp_format || strcmp(evsel->tp_format->system, "syscalls"))
3114+
continue;
3115+
3116+
free(et->fmt);
3117+
free(et);
3118+
}
3119+
}
3120+
31063121
static void trace__handle_event(struct trace *trace, union perf_event *event, struct perf_sample *sample)
31073122
{
31083123
const u32 type = event->header.type;
@@ -4138,7 +4153,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
41384153

41394154
out_delete_evlist:
41404155
trace__symbols__exit(trace);
4141-
4156+
evlist__free_syscall_tp_fields(evlist);
41424157
evlist__delete(evlist);
41434158
cgroup__put(trace->cgroup);
41444159
trace->evlist = NULL;

0 commit comments

Comments
 (0)