Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf symbols: Fix endless loop in dso__split_kallsyms_for_kcore

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 <mpetlan@redhat.com>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/20151026135130.GA26003@krava.brq.redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Jiri Olsa and committed by
Arnaldo Carvalho de Melo
443f8c75 374ce938

+1 -1
+1 -1
tools/perf/util/symbol.c
··· 680 680 pos->start -= curr_map->start - curr_map->pgoff; 681 681 if (pos->end) 682 682 pos->end -= curr_map->start - curr_map->pgoff; 683 - if (curr_map != map) { 683 + if (curr_map->dso != map->dso) { 684 684 rb_erase_init(&pos->rb_node, root); 685 685 symbols__insert( 686 686 &curr_map->dso->symbols[curr_map->type],