perf symbols: Fix endless loop in dso__split_kallsyms_for_kcore
authorJiri Olsa <[email protected]>
Mon, 26 Oct 2015 13:51:30 +0000 (14:51 +0100)
committerArnaldo Carvalho de Melo <[email protected]>
Wed, 28 Oct 2015 14:19:30 +0000 (11:19 -0300)
Currently we split symbols based on the map comparison, but symbols are stored
within dso objects and maps could point into same dso objects (kernel maps).

Hence we could end up changing rbtree we are currently iterating and mess it
up. It's easily reproduced on s390x by running:

  $ perf record -a -- sleep 3
  $ perf buildid-list -i perf.data --with-hits

The fix is to compare dso objects instead.

Reported-by: Michael Petlan <[email protected]>
Signed-off-by: Jiri Olsa <[email protected]>
Acked-by: Adrian Hunter <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Kan Liang <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
tools/perf/util/symbol.c

index 71bf711a628cedceaf52d703f1992847e028c057..b4cc7662677ec858cddf6dd90e906f75c5a14200 100644 (file)
@@ -680,7 +680,7 @@ static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
                        pos->start -= curr_map->start - curr_map->pgoff;
                        if (pos->end)
                                pos->end -= curr_map->start - curr_map->pgoff;
-                       if (curr_map != map) {
+                       if (curr_map->dso != map->dso) {
                                rb_erase_init(&pos->rb_node, root);
                                symbols__insert(
                                        &curr_map->dso->symbols[curr_map->type],