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

perf report: Fix sort__sym_cmp to also compare end of symbol

When using a map file from a JIT, due to memory reuse, we can obtain
multiple symbols with the same start address but a different length.

The symbols__find does check for the end so not doing it in
sort__sym_cmp was causing the hist_entry in the annotate part of a
report to match to the wrong entry, causing a fatal error.

Signed-off-by: Yannick Brosseau <scientist@fb.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: kernel-team@fb.com
Link: http://lkml.kernel.org/r/1434584470-17771-1-git-send-email-scientist@fb.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Yannick Brosseau and committed by
Arnaldo Carvalho de Melo
c05676c0 3e323dc0

+3 -5
+3 -5
tools/perf/util/sort.c
··· 182 182 183 183 static int64_t _sort__sym_cmp(struct symbol *sym_l, struct symbol *sym_r) 184 184 { 185 - u64 ip_l, ip_r; 186 - 187 185 if (!sym_l || !sym_r) 188 186 return cmp_null(sym_l, sym_r); 189 187 190 188 if (sym_l == sym_r) 191 189 return 0; 192 190 193 - ip_l = sym_l->start; 194 - ip_r = sym_r->start; 191 + if (sym_l->start != sym_r->start) 192 + return (int64_t)(sym_r->start - sym_l->start); 195 193 196 - return (int64_t)(ip_r - ip_l); 194 + return (int64_t)(sym_r->end - sym_l->end); 197 195 } 198 196 199 197 static int64_t