Commit 4f74f187 authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo

perf symbols: Factor out annotation init/exit

The exit function fixes a memory leak with the src field as detected by
leak sanitizer. An example of which is:

Indirect leak of 25133184 byte(s) in 207 object(s) allocated from:
    #0 0x7f199ecfe987 in __interceptor_calloc libsanitizer/asan/asan_malloc_linux.cpp:154
    #1 0x55defe638224 in annotated_source__alloc_histograms util/annotate.c:803
    #2 0x55defe6397e4 in symbol__hists util/annotate.c:952
    #3 0x55defe639908 in symbol__inc_addr_samples util/annotate.c:968
    #4 0x55defe63aa29 in hist_entry__inc_addr_samples util/annotate.c:1119
    #5 0x55defe499a79 in hist_iter__report_callback tools/perf/builtin-report.c:182
    #6 0x55defe7a859d in hist_entry_iter__add util/hist.c:1236
    #7 0x55defe49aa63 in process_sample_event tools/perf/builtin-report.c:315
    #8 0x55defe731bc8 in evlist__deliver_sample util/session.c:1473
    #9 0x55defe731e38 in machines__deliver_event util/session.c:1510
    #10 0x55defe732a23 in perf_session__deliver_event util/session.c:1590
    #11 0x55defe72951e in ordered_events__deliver_event util/session.c:183
    #12 0x55defe740082 in do_flush util/ordered-events.c:244
    #13 0x55defe7407cb in __ordered_events__flush util/ordered-events.c:323
    #14 0x55defe740a61 in ordered_events__flush util/ordered-events.c:341
    #15 0x55defe73837f in __perf_session__process_events util/session.c:2390
    #16 0x55defe7385ff in perf_session__process_events util/session.c:2420
    ...
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Martin Liška <mliska@suse.cz>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: https://lore.kernel.org/r/20211112035124.94327-3-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 42704567
...@@ -1255,6 +1255,17 @@ int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool r ...@@ -1255,6 +1255,17 @@ int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool r
return ins__scnprintf(&dl->ins, bf, size, &dl->ops, max_ins_name); return ins__scnprintf(&dl->ins, bf, size, &dl->ops, max_ins_name);
} }
void annotation__init(struct annotation *notes)
{
pthread_mutex_init(&notes->lock, NULL);
}
void annotation__exit(struct annotation *notes)
{
annotated_source__delete(notes->src);
pthread_mutex_destroy(&notes->lock);
}
static void annotation_line__add(struct annotation_line *al, struct list_head *head) static void annotation_line__add(struct annotation_line *al, struct list_head *head)
{ {
list_add_tail(&al->node, head); list_add_tail(&al->node, head);
......
...@@ -299,6 +299,9 @@ struct annotation { ...@@ -299,6 +299,9 @@ struct annotation {
struct annotated_source *src; struct annotated_source *src;
}; };
void annotation__init(struct annotation *notes);
void annotation__exit(struct annotation *notes);
static inline int annotation__cycles_width(struct annotation *notes) static inline int annotation__cycles_width(struct annotation *notes)
{ {
if (notes->have_cycles && notes->options->show_minmax_cycle) if (notes->have_cycles && notes->options->show_minmax_cycle)
......
...@@ -274,7 +274,7 @@ struct symbol *symbol__new(u64 start, u64 len, u8 binding, u8 type, const char * ...@@ -274,7 +274,7 @@ struct symbol *symbol__new(u64 start, u64 len, u8 binding, u8 type, const char *
if (symbol_conf.priv_size) { if (symbol_conf.priv_size) {
if (symbol_conf.init_annotation) { if (symbol_conf.init_annotation) {
struct annotation *notes = (void *)sym; struct annotation *notes = (void *)sym;
pthread_mutex_init(&notes->lock, NULL); annotation__init(notes);
} }
sym = ((void *)sym) + symbol_conf.priv_size; sym = ((void *)sym) + symbol_conf.priv_size;
} }
...@@ -294,6 +294,13 @@ struct symbol *symbol__new(u64 start, u64 len, u8 binding, u8 type, const char * ...@@ -294,6 +294,13 @@ struct symbol *symbol__new(u64 start, u64 len, u8 binding, u8 type, const char *
void symbol__delete(struct symbol *sym) void symbol__delete(struct symbol *sym)
{ {
if (symbol_conf.priv_size) {
if (symbol_conf.init_annotation) {
struct annotation *notes = symbol__annotation(sym);
annotation__exit(notes);
}
}
free(((void *)sym) - symbol_conf.priv_size); free(((void *)sym) - symbol_conf.priv_size);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment