forked from Minki/linux
perf machine: Read also the end of the kernel
We mark the end of kernel based on the first module, but that could cover some bpf program maps. Reading _etext symbol if it's present to get precise kernel map end. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Acked-by: Song Liu <songliubraving@fb.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stanislav Fomichev <sdf@google.com> Cc: Thomas Richter <tmricht@linux.ibm.com> Link: http://lkml.kernel.org/r/20190508132010.14512-6-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
93f678b9ae
commit
ed9adb2035
@ -924,7 +924,8 @@ const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};
|
||||
* symbol_name if it's not that important.
|
||||
*/
|
||||
static int machine__get_running_kernel_start(struct machine *machine,
|
||||
const char **symbol_name, u64 *start)
|
||||
const char **symbol_name,
|
||||
u64 *start, u64 *end)
|
||||
{
|
||||
char filename[PATH_MAX];
|
||||
int i, err = -1;
|
||||
@ -949,6 +950,11 @@ static int machine__get_running_kernel_start(struct machine *machine,
|
||||
*symbol_name = name;
|
||||
|
||||
*start = addr;
|
||||
|
||||
err = kallsyms__get_function_start(filename, "_etext", &addr);
|
||||
if (!err)
|
||||
*end = addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1441,7 +1447,7 @@ int machine__create_kernel_maps(struct machine *machine)
|
||||
struct dso *kernel = machine__get_kernel(machine);
|
||||
const char *name = NULL;
|
||||
struct map *map;
|
||||
u64 addr = 0;
|
||||
u64 start = 0, end = ~0ULL;
|
||||
int ret;
|
||||
|
||||
if (kernel == NULL)
|
||||
@ -1460,9 +1466,9 @@ int machine__create_kernel_maps(struct machine *machine)
|
||||
"continuing anyway...\n", machine->pid);
|
||||
}
|
||||
|
||||
if (!machine__get_running_kernel_start(machine, &name, &addr)) {
|
||||
if (!machine__get_running_kernel_start(machine, &name, &start, &end)) {
|
||||
if (name &&
|
||||
map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map, name, addr)) {
|
||||
map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map, name, start)) {
|
||||
machine__destroy_kernel_maps(machine);
|
||||
ret = -1;
|
||||
goto out_put;
|
||||
@ -1472,16 +1478,19 @@ int machine__create_kernel_maps(struct machine *machine)
|
||||
* we have a real start address now, so re-order the kmaps
|
||||
* assume it's the last in the kmaps
|
||||
*/
|
||||
machine__update_kernel_mmap(machine, addr, ~0ULL);
|
||||
machine__update_kernel_mmap(machine, start, end);
|
||||
}
|
||||
|
||||
if (machine__create_extra_kernel_maps(machine, kernel))
|
||||
pr_debug("Problems creating extra kernel maps, continuing anyway...\n");
|
||||
|
||||
/* update end address of the kernel map using adjacent module address */
|
||||
map = map__next(machine__kernel_map(machine));
|
||||
if (map)
|
||||
machine__set_kernel_mmap(machine, addr, map->start);
|
||||
if (end == ~0ULL) {
|
||||
/* update end address of the kernel map using adjacent module address */
|
||||
map = map__next(machine__kernel_map(machine));
|
||||
if (map)
|
||||
machine__set_kernel_mmap(machine, start, map->start);
|
||||
}
|
||||
|
||||
out_put:
|
||||
dso__put(kernel);
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user