perf tools: Check if a map is still in use when deleting it
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: facf3f0621b2e11957af1aae9085730ea78ccf85 Gitweb: http://git.kernel.org/tip/facf3f0621b2e11957af1aae9085730ea78ccf85 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Mon, 25 May 2015 15:30:09 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 27 May 2015 20:27:16 -0300
perf tools: Check if a map is still in use when deleting it
I.e. match RB_CLEAR_NODE() with RB_EMPTY_NODE(), to check that it isn't in a rb tree at the time of its deletion.
Cc Adrian Hunter <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc David Ahern <[email protected]>
Cc Don Zickus <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/builtin-annotate.c | 4 ++++ tools/perf/util/map.c | 9 +++++---- tools/perf/util/symbol.c | 8 ++++---- 3 files changed, 13 insertions(+), 8 deletions(-)
tools/perf/builtin-annotate.c +4 -0
@@ -59,6 +59,10 @@ static int perf_evsel__add_sample(struct perf_evsel *evsel, (al->sym == NULL || strcmp(ann->sym_hist_filter, al->sym->name) != 0)) {/* We're only interested in a symbol named sym_hist_filter */ +/* +* FIXME: why isn't this done in the symbol_filter when loading +* the DSO? +*/ if (al->sym !=NULL ) {rb_erase (&al->sym->rb_node, &al->map->dso->symbols[al->map->type]);
tools/perf/util/map.c +5 -4
@@ -225,6 +225,7 @@ struct map *map__new2(u64 start, struct dso *dso, enum map_type type)void map__delete (struct map *map) { +BUG_ON (!RB_EMPTY_NODE (&map->rb_node));free (map); }
@@ -446,7 +447,7 @@ static void __maps__purge(struct maps *maps) struct map *pos = rb_entry(next, struct map, rb_node); next =rb_next (&pos->rb_node); -rb_erase (&pos->rb_node, root); +rb_erase_init (&pos->rb_node, root);map__delete (pos); } }
@@ -456,7 +457,7 @@ static void __maps__purge_removed_maps(struct maps *maps)struct map *pos, *n;list_for_each_entry_safe (pos, n, &maps->removed_maps, node) { -list_del (&pos->node); +list_del_init (&pos->node);map__delete (pos); } }
@@ -671,7 +672,7 @@ static int maps__fixup_overlappings(struct maps *maps, struct map *map, FILE *fpmap__fprintf (pos, fp); } -rb_erase (&pos->rb_node, root); +rb_erase_init (&pos->rb_node, root);/* * Now check if we need to create new maps for areas not * overlapped by the new map:
@@ -782,7 +783,7 @@ void maps__insert(struct maps *maps, struct map *map)static void __maps__remove (struct maps *maps,struct map *map) { -rb_erase (&map->rb_node, &maps->entries); +rb_erase_init (&map->rb_node, &maps->entries); }void maps__remove (struct maps *maps,struct map *map)
tools/perf/util/symbol.c +4 -4
@@ -659,14 +659,14 @@ static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map, curr_map =map_groups__find (kmaps, map->type, pos->start);if (!curr_map || (filter &&filter (curr_map, pos))) { -rb_erase (&pos->rb_node, root); +rb_erase_init (&pos->rb_node, root);symbol__delete (pos); }else { pos->start -= curr_map->start - curr_map->pgoff;if (pos->end) pos->end -= curr_map->start - curr_map->pgoff;if (curr_map != map) { -rb_erase (&pos->rb_node, root); +rb_erase_init (&pos->rb_node, root);symbols__insert ( &curr_map->dso->symbols[curr_map->type], pos);
@@ -1173,7 +1173,7 @@ static int dso__load_kcore(struct dso *dso, struct map *map,/* Add new maps */ while (!list_empty (&md.maps)) { new_map = list_entry(md.maps.next, struct map, node); -list_del (&new_map->node); +list_del_init (&new_map->node);if (new_map == replacement_map) { map->start = new_map->start; map->end = new_map->end;
@@ -1211,7 +1211,7 @@ static int dso__load_kcore(struct dso *dso, struct map *map, out_err:while (!list_empty (&md.maps)) { map = list_entry(md.maps.next, struct map, node); -list_del (&map->node); +list_del_init (&map->node);map__delete (map); }close (fd);