Commit ed9adb20 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

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: default avatarJiri Olsa <jolsa@kernel.org>
Acked-by: default avatarSong 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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 93f678b9
...@@ -924,7 +924,8 @@ const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL}; ...@@ -924,7 +924,8 @@ const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};
* symbol_name if it's not that important. * symbol_name if it's not that important.
*/ */
static int machine__get_running_kernel_start(struct machine *machine, 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]; char filename[PATH_MAX];
int i, err = -1; int i, err = -1;
...@@ -949,6 +950,11 @@ static int machine__get_running_kernel_start(struct machine *machine, ...@@ -949,6 +950,11 @@ static int machine__get_running_kernel_start(struct machine *machine,
*symbol_name = name; *symbol_name = name;
*start = addr; *start = addr;
err = kallsyms__get_function_start(filename, "_etext", &addr);
if (!err)
*end = addr;
return 0; return 0;
} }
...@@ -1441,7 +1447,7 @@ int machine__create_kernel_maps(struct machine *machine) ...@@ -1441,7 +1447,7 @@ int machine__create_kernel_maps(struct machine *machine)
struct dso *kernel = machine__get_kernel(machine); struct dso *kernel = machine__get_kernel(machine);
const char *name = NULL; const char *name = NULL;
struct map *map; struct map *map;
u64 addr = 0; u64 start = 0, end = ~0ULL;
int ret; int ret;
if (kernel == NULL) if (kernel == NULL)
...@@ -1460,9 +1466,9 @@ int machine__create_kernel_maps(struct machine *machine) ...@@ -1460,9 +1466,9 @@ int machine__create_kernel_maps(struct machine *machine)
"continuing anyway...\n", machine->pid); "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 && 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); machine__destroy_kernel_maps(machine);
ret = -1; ret = -1;
goto out_put; goto out_put;
...@@ -1472,16 +1478,19 @@ int machine__create_kernel_maps(struct machine *machine) ...@@ -1472,16 +1478,19 @@ int machine__create_kernel_maps(struct machine *machine)
* we have a real start address now, so re-order the kmaps * we have a real start address now, so re-order the kmaps
* assume it's the last in 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)) if (machine__create_extra_kernel_maps(machine, kernel))
pr_debug("Problems creating extra kernel maps, continuing anyway...\n"); pr_debug("Problems creating extra kernel maps, continuing anyway...\n");
if (end == ~0ULL) {
/* update end address of the kernel map using adjacent module address */ /* update end address of the kernel map using adjacent module address */
map = map__next(machine__kernel_map(machine)); map = map__next(machine__kernel_map(machine));
if (map) if (map)
machine__set_kernel_mmap(machine, addr, map->start); machine__set_kernel_mmap(machine, start, map->start);
}
out_put: out_put:
dso__put(kernel); dso__put(kernel);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment