linux/tools/perf/util
Daniel Borkmann ca9b52bc5a perf symbols: Fix symbols__fixup_end heuristic for corner cases
commit e7ede72a6d upstream.

The current symbols__fixup_end() heuristic for the last entry in the rb
tree is suboptimal as it leads to not being able to recognize the symbol
in the call graph in a couple of corner cases, for example:

 i) If the symbol has a start address (f.e. exposed via kallsyms)
    that is at a page boundary, then the roundup(curr->start, 4096)
    for the last entry will result in curr->start == curr->end with
    a symbol length of zero.

ii) If the symbol has a start address that is shortly before a page
    boundary, then also here, curr->end - curr->start will just be
    very few bytes, where it's unrealistic that we could perform a
    match against.

Instead, change the heuristic to roundup(curr->start, 4096) + 4096, so
that we can catch such corner cases and have a better chance to find
that specific symbol. It's still just best effort as the real end of the
symbol is unknown to us (and could even be at a larger offset than the
current range), but better than the current situation.

Alexei reported that he recently run into case i) with a JITed eBPF
program (these are all page aligned) as the last symbol which wasn't
properly shown in the call graph (while other eBPF program symbols in
the rb tree were displayed correctly). Since this is a generic issue,
lets try to improve the heuristic a bit.

Reported-and-Tested-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Fixes: 2e538c4a18 ("perf tools: Improve kernel/modules symbol lookup")
Link: http://lkml.kernel.org/r/bb5c80d27743be6f12afc68405f1956a330e1bc9.1489614365.git.daniel@iogearbox.net
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
History 2017-07-18 18:40:19 +01:00
..
include tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
scripting-engines perf script/python: Print array argument as string 2014-06-09 12:21:03 +02:00
abspath.c perf tools: Remove some unused functions 2010-05-18 23:03:35 -03:00
alias.c perf tools: Introduce zfree 2013-12-27 15:17:00 -03:00
annotate.c perf annotate: Print the evsel name in the stdio output 2014-03-18 18:17:03 -03:00
annotate.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
bitmap.c perf tools: Add bitmap_or function into bitmap object 2012-02-13 23:28:10 -02:00
build-id.c perf tools: Use tid for finding thread 2014-05-12 11:09:50 +02:00
build-id.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
cache.h tools/perf: Turn strlcpy() into a __weak function 2013-10-09 08:48:49 +02:00
callchain.c perf tools: Update cpumode for each cumulative entry 2014-06-01 14:34:58 +02:00
callchain.h perf callchain: Add callchain_cursor_snapshot() 2014-06-01 14:34:59 +02:00
cgroup.c perf evlist: Introduce evlist__for_each() & friends 2014-01-13 10:06:25 -03:00
cgroup.h perf tool: Add cgroup support 2011-02-16 13:30:48 +01:00
color.c perf diff: Color the Ratio column 2014-01-13 11:37:17 -03:00
color.h perf diff: Color the Ratio column 2014-01-13 11:37:17 -03:00
comm.c perf tools: Do proper comm override error handling 2014-01-16 16:44:39 -03:00
comm.h perf tools: Do proper comm override error handling 2014-01-16 16:44:39 -03:00
config.c perf tools: Add hist.percentage config option 2014-04-16 17:16:04 +02:00
cpumap.c perf tools: Use cpu/possible instead of cpu/kernel_max 2014-04-22 17:39:16 +02:00
cpumap.h perf tools: Allow ability to map cpus to nodes easily 2014-04-22 17:39:12 +02:00
ctype.c perf tools: ctype.c only wants util.h 2012-02-13 23:17:40 -02:00
data.c perf tools: Improve error reporting 2014-04-20 00:15:12 +02:00
data.h perf tools: Add perf_data_file__write interface 2013-12-02 09:22:46 -03:00
debug.c perf tools: Get rid of a duplicate va_end() in error reporting routine 2013-12-19 11:38:42 -03:00
debug.h perf tools: Overload pr_stat traceevent print function 2013-12-04 15:23:55 -03:00
dso.c perf tools: Add dso__data_* interface descriptons 2014-06-12 16:53:22 +02:00
dso.h perf tools: Add dso__data_* interface descriptons 2014-06-12 16:53:22 +02:00
dwarf-aux.c perf probe: Fix perf probe to find correct variable DIE 2014-06-04 14:49:20 +02:00
dwarf-aux.h perf probe: Fix to find line information for probe list 2013-10-04 15:16:05 -03:00
environment.c perf_counter tools: Move from Documentation/perf_counter/ to tools/perf/ 2009-06-06 20:33:43 +02:00
event.c perf tools: handle spaces in file names obtained from /proc/pid/maps 2016-05-01 00:05:46 +02:00
event.h perf tools: Cache register accesses for unwind processing 2014-06-12 16:53:19 +02:00
evlist.c perf evlist: Fix typo in perf_evlist__start_workload() 2017-06-05 21:16:49 +01:00
evlist.h perf evlist: Introduce evlist__for_each() & friends 2014-01-13 10:06:25 -03:00
evsel.c perf record: Fix to honor user freq/interval properly 2014-06-12 16:53:18 +02:00
evsel.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
exec_cmd.c perf tools: Makefile: Remove various and sundry cruft 2011-02-18 07:43:06 -02:00
exec_cmd.h perf tools: Remove some unused functions 2010-05-18 23:03:35 -03:00
generate-cmdlist.sh tools/perf: Standardize feature support define names to: HAVE_{FEATURE}_SUPPORT 2013-10-09 08:48:28 +02:00
header.c perf header: Fixup reading of HEADER_NRCPUS feature 2015-10-06 11:52:30 +01:00
header.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
help.c perf tools: Use zfree to help detect use after free bugs 2013-12-27 17:08:19 -03:00
help.h perf tools: Protect header files with a consistent style 2009-09-24 21:27:51 +02:00
hist.c perf hists: Fix HISTC_MEM_DCACHELINE width setting 2016-02-17 10:22:47 +00:00
hist.h perf session: Do not fail on processing out of order event 2015-01-16 14:34:37 +00:00
hweight.c perf tools: Don't use code surrounded by __KERNEL__ 2010-05-02 12:00:44 -03:00
intlist.c perf util: Add findnew method to intlist 2013-10-14 10:28:48 -03:00
intlist.h perf util: Add findnew method to intlist 2013-10-14 10:28:48 -03:00
levenshtein.c perf_counter tools: Move from Documentation/perf_counter/ to tools/perf/ 2009-06-06 20:33:43 +02:00
levenshtein.h perf tools: Protect header files with a consistent style 2009-09-24 21:27:51 +02:00
machine.c perf symbols: Get kernel start address by symbol name 2014-06-20 09:34:22 +02:00
machine.h perf machine: Factor machine__find_thread to take tid argument 2014-03-14 18:08:42 -03:00
map.c perf tools: Update mmap2 interface with protection and flag bits 2014-06-09 13:34:45 +02:00
map.h perf tools: Update mmap2 interface with protection and flag bits 2014-06-09 13:34:45 +02:00
pager.c perf tools: Add cat as fallback pager 2014-05-21 11:48:33 +02:00
parse-events.c perf list: Fix checking for supported events on older kernels 2014-02-10 11:34:31 -03:00
parse-events.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
parse-events.l perf tools: Move start conditions to start of the flex file 2013-10-11 12:17:31 -03:00
parse-events.y tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
parse-options.c perf kvm: introduce --list-cmds for use by scripts 2014-03-14 18:08:41 -03:00
parse-options.h perf kvm: introduce --list-cmds for use by scripts 2014-03-14 18:08:41 -03:00
path.c tools/perf: Turn strlcpy() into a __weak function 2013-10-09 08:48:49 +02:00
PERF-VERSION-GEN perf tools: Fix version when building out of tree 2013-11-07 10:40:47 -03:00
perf_regs.c perf tools: Fix perf regs mask generation 2016-08-22 22:37:58 +01:00
perf_regs.h perf tools: Cache register accesses for unwind processing 2014-06-12 16:53:19 +02:00
pmu.c perf tools: Dont stop PMU parsing on alias parse error 2016-05-01 00:05:49 +02:00
pmu.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
pmu.l perf tools: Add perf pmu object to access pmu format definition 2012-03-16 14:29:35 -03:00
pmu.y perf tools: Fix build with bison 2.3 and older. 2013-02-14 16:12:34 -03:00
probe-event.c perf probe: Improve error messages in --line option 2014-06-10 10:02:06 -03:00
probe-event.h perf probe: Replace line_list with intlist 2014-02-18 09:34:50 -03:00
probe-finder.c perf probe: Improve an error message of perf probe --vars mode 2014-06-09 14:35:58 -03:00
probe-finder.h perf probe: Support distro-style debuginfo for uprobe 2014-02-18 09:38:44 -03:00
pstack.c perf tools: Stop using 'self' in pstack 2012-11-14 16:50:38 -03:00
pstack.h perf tools: Finish the removal of 'self' arguments 2013-11-05 15:32:36 -03:00
python-ext-sources perf tools: Move fs.* to lib/api/fs/ 2014-02-18 09:34:49 -03:00
python.c perf evlist: Introduce evlist__for_each() & friends 2014-01-13 10:06:25 -03:00
quote.c perf tools: Remove some unused functions 2010-05-18 23:03:35 -03:00
quote.h perf tools: Remove some unused functions 2010-05-18 23:03:35 -03:00
rblist.c perf util: Add findnew method to intlist 2013-10-14 10:28:48 -03:00
rblist.h perf util: Add findnew method to intlist 2013-10-14 10:28:48 -03:00
record.c perf tools: Move fs.* to lib/api/fs/ 2014-02-18 09:34:49 -03:00
run-command.c perf tools: Remove some unused functions 2010-05-18 23:03:35 -03:00
run-command.h perf tools: Remove some unused functions 2010-05-18 23:03:35 -03:00
session.c perf session: Do not fail on processing out of order event 2015-01-16 14:34:37 +00:00
session.h perf symbols: Add 'machine' member to struct addr_location 2013-12-19 17:38:27 -03:00
setup.py tools/: Convert to new topic libraries 2013-12-16 16:03:27 -03:00
sigchain.c perf tools: Remove some unused functions 2010-05-18 23:03:35 -03:00
sigchain.h perf tools: Remove some unused functions 2010-05-18 23:03:35 -03:00
sort.c perf tools: Add dcacheline sort 2014-06-09 13:34:49 +02:00
sort.h perf tools: Add dcacheline sort 2014-06-09 13:34:49 +02:00
srcline.c perf tools: Fix build error due to zfree() cast 2014-01-15 15:10:04 -03:00
stat.c perf stats: Add max and min stats 2013-08-07 17:35:26 -03:00
stat.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
strbuf.c perf tools: Use zfree to help detect use after free bugs 2013-12-27 17:08:19 -03:00
strbuf.h perf tools: Remove some unused functions 2010-05-18 23:03:35 -03:00
strfilter.c perf tools: Use zfree to help detect use after free bugs 2013-12-27 17:08:19 -03:00
strfilter.h perf tools: Finish the removal of 'self' arguments 2013-11-05 15:32:36 -03:00
string.c perf tools: Use zfree to help detect use after free bugs 2013-12-27 17:08:19 -03:00
strlist.c perf tools: Fix build error due to zfree() cast 2014-01-15 15:10:04 -03:00
strlist.h perf tools: Stop using 'self' in strlist 2013-01-25 12:49:28 -03:00
svghelper.c tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
svghelper.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
symbol-elf.c perf symbols: Fixup symbol sizes before picking best ones 2017-02-23 03:53:56 +00:00
symbol-minimal.c perf tools: Use zfree to help detect use after free bugs 2013-12-27 17:08:19 -03:00
symbol.c perf symbols: Fix symbols__fixup_end heuristic for corner cases 2017-07-18 18:40:19 +01:00
symbol.h perf symbols: Store if there is a filter in place 2015-08-11 09:57:25 +01:00
target.c perf record: Make per-cpu mmaps the default. 2013-11-27 14:58:36 -03:00
target.h perf target: Move the checking of which map function to call into function. 2013-12-04 13:46:37 -03:00
thread.c perf tools: Share map_groups among threads of the same group 2014-04-28 13:43:33 +02:00
thread.h perf tools: Share map_groups among threads of the same group 2014-04-28 13:43:33 +02:00
thread_map.c perf tools: Use zfree to help detect use after free bugs 2013-12-27 17:08:19 -03:00
thread_map.h perf evlist: Add thread_map__nr() helper 2013-03-15 13:06:02 -03:00
tool.h perf tools: Add attr->mmap2 support 2013-09-11 10:09:32 -03:00
top.c perf tools: Rename 'perf_record_opts' to 'record_opts 2013-12-19 14:43:45 -03:00
top.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
trace-event-info.c perf tools: Use zfree to help detect use after free bugs 2013-12-27 17:08:19 -03:00
trace-event-parse.c perf tools: Fix memory leak in event_format__print function 2014-02-18 09:34:47 -03:00
trace-event-read.c perf tools: Add trace-event object 2013-12-04 15:20:52 -03:00
trace-event-scripting.c perf scripting: Avoid leaking the scripting_context variable 2017-03-16 02:26:17 +00:00
trace-event.c tools lib traceevent: Make plugin unload function receive pevent 2014-01-15 15:10:40 -03:00
trace-event.h perf symbols: Add 'machine' member to struct addr_location 2013-12-19 17:38:27 -03:00
unwind-libdw.c tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
unwind-libdw.h perf tools: Add libdw DWARF post unwind support 2014-02-24 09:29:36 -03:00
unwind-libunwind.c perf tools: Cache dso data file descriptor 2014-06-12 16:53:20 +02:00
unwind.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
usage.c perf target: Introduce perf_target__parse_uid() 2012-05-07 16:46:48 -03:00
util.c perf tools: Add support to dynamically get cacheline size 2014-06-09 13:34:48 +02:00
util.h perf tools: Add support to dynamically get cacheline size 2014-06-09 13:34:48 +02:00
values.c perf tools: Use zfree to help detect use after free bugs 2013-12-27 17:08:19 -03:00
values.h tools: Consolidate types.h 2014-05-01 21:22:39 +02:00
vdso.c perf symbols: Remove open coded management of long_name_allocated member 2013-12-10 16:51:09 -03:00
vdso.h perf tools: Back [vdso] DSO with real data 2012-09-11 12:08:30 -03:00
wrapper.c perf tools: Use __maybe_used for unused variables 2012-09-11 12:19:15 -03:00
xyarray.c perf tools: Introduce event selectors 2011-01-03 16:39:04 -02:00
xyarray.h perf tools: Introduce event selectors 2011-01-03 16:39:04 -02:00