diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-11-21 11:31:24 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-11-21 11:45:58 -0500 |
commit | 90c83218c32d7c474da810cd3c9973a43ecbcb9b (patch) | |
tree | 0682d2df050db19c45f3397f2a92550650c74fdf /tools | |
parent | 8904b18046c2f050107f6449e887e7c1142b9ab9 (diff) |
perf symbols: Fixup kernel_maps__fixup_end end map
We better call this routine after both the kernel and modules
are loaded, because as it was if there weren't modules it would not
be called, resulting in kernel_map->end remaining at zero, so no
map would be found and consequently the kernel symtab wouldn't
get loaded, i.e. no kernel symbols would be resolved.
Also this fixes another case, that is when we _have_ modules,
but the last map would have its ->end address not set before we
loaded its symbols, which would never happen because ->end was
not set.
Reported-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1258821086-11521-1-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/symbol.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 48f87f065a2e..e161a51c9fef 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
@@ -71,6 +71,12 @@ static void kernel_maps__fixup_end(void) | |||
71 | curr = rb_entry(nd, struct map, rb_node); | 71 | curr = rb_entry(nd, struct map, rb_node); |
72 | prev->end = curr->start - 1; | 72 | prev->end = curr->start - 1; |
73 | } | 73 | } |
74 | |||
75 | /* | ||
76 | * We still haven't the actual symbols, so guess the | ||
77 | * last map final address. | ||
78 | */ | ||
79 | curr->end = ~0UL; | ||
74 | } | 80 | } |
75 | 81 | ||
76 | static struct symbol *symbol__new(u64 start, u64 len, const char *name) | 82 | static struct symbol *symbol__new(u64 start, u64 len, const char *name) |
@@ -1319,12 +1325,6 @@ static int kernel_maps__create_module_maps(void) | |||
1319 | free(line); | 1325 | free(line); |
1320 | fclose(file); | 1326 | fclose(file); |
1321 | 1327 | ||
1322 | /* | ||
1323 | * Now that we have all sorted out, just set the ->end of all | ||
1324 | * maps: | ||
1325 | */ | ||
1326 | kernel_maps__fixup_end(); | ||
1327 | |||
1328 | return dsos__set_modules_path(); | 1328 | return dsos__set_modules_path(); |
1329 | 1329 | ||
1330 | out_delete_line: | 1330 | out_delete_line: |
@@ -1493,7 +1493,10 @@ int kernel_maps__init(bool use_modules) | |||
1493 | if (use_modules && kernel_maps__create_module_maps() < 0) | 1493 | if (use_modules && kernel_maps__create_module_maps() < 0) |
1494 | pr_warning("Failed to load list of modules in use, " | 1494 | pr_warning("Failed to load list of modules in use, " |
1495 | "continuing...\n"); | 1495 | "continuing...\n"); |
1496 | 1496 | /* | |
1497 | * Now that we have all the maps created, just set the ->end of them: | ||
1498 | */ | ||
1499 | kernel_maps__fixup_end(); | ||
1497 | return 0; | 1500 | return 0; |
1498 | } | 1501 | } |
1499 | 1502 | ||