perf machine: Don't search for active kernel start in __machine__create_kernel_maps
We should not search for the kernel start address in __machine__create_kernel_maps(), because it's being used in the 'report' code path, where we are interested in kernel MMAP data address (the one recorded via 'perf record', possibly on another machine, or an older or newer kernel on the same machine where analysis is being performed) instead of in current kernel address. The __machine__create_kernel_maps() function serves purely for creating the machines kernel maps and setting up the kmap group. The report code path then sets the address based on the data from kernel MMAP event in the machine__set_kernel_mmap() function. The kallsyms search address logic is used for test code, that calls machine__create_kernel_maps() to get current maps and calls machine__get_running_kernel_start() to get kernel starting address. Use machine__set_kernel_mmap() to set the kernel maps start address and moving map_groups__fixup_end to be call when all maps are in place. Also make __machine__create_kernel_maps static, because there's no external user. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20180215122635.24029-7-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
05db6ff73d
Коммит
1fb87b8e95
|
@ -856,13 +856,10 @@ static int machine__get_running_kernel_start(struct machine *machine,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
|
static int
|
||||||
|
__machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
|
||||||
{
|
{
|
||||||
int type;
|
int type;
|
||||||
u64 start = 0;
|
|
||||||
|
|
||||||
if (machine__get_running_kernel_start(machine, NULL, &start))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* In case of renewal the kernel map, destroy previous one */
|
/* In case of renewal the kernel map, destroy previous one */
|
||||||
machine__destroy_kernel_maps(machine);
|
machine__destroy_kernel_maps(machine);
|
||||||
|
@ -871,7 +868,7 @@ int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
|
||||||
struct kmap *kmap;
|
struct kmap *kmap;
|
||||||
struct map *map;
|
struct map *map;
|
||||||
|
|
||||||
machine->vmlinux_maps[type] = map__new2(start, kernel, type);
|
machine->vmlinux_maps[type] = map__new2(0, kernel, type);
|
||||||
if (machine->vmlinux_maps[type] == NULL)
|
if (machine->vmlinux_maps[type] == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -1222,6 +1219,24 @@ static int machine__create_modules(struct machine *machine)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void machine__set_kernel_mmap(struct machine *machine,
|
||||||
|
u64 start, u64 end)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < MAP__NR_TYPES; i++) {
|
||||||
|
machine->vmlinux_maps[i]->start = start;
|
||||||
|
machine->vmlinux_maps[i]->end = end;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Be a bit paranoid here, some perf.data file came with
|
||||||
|
* a zero sized synthesized MMAP event for the kernel.
|
||||||
|
*/
|
||||||
|
if (machine->vmlinux_maps[i]->end == 0)
|
||||||
|
machine->vmlinux_maps[i]->end = ~0ULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int machine__create_kernel_maps(struct machine *machine)
|
int machine__create_kernel_maps(struct machine *machine)
|
||||||
{
|
{
|
||||||
struct dso *kernel = machine__get_kernel(machine);
|
struct dso *kernel = machine__get_kernel(machine);
|
||||||
|
@ -1246,40 +1261,22 @@ int machine__create_kernel_maps(struct machine *machine)
|
||||||
"continuing anyway...\n", machine->pid);
|
"continuing anyway...\n", machine->pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Now that we have all the maps created, just set the ->end of them:
|
|
||||||
*/
|
|
||||||
map_groups__fixup_end(&machine->kmaps);
|
|
||||||
|
|
||||||
if (!machine__get_running_kernel_start(machine, &name, &addr)) {
|
if (!machine__get_running_kernel_start(machine, &name, &addr)) {
|
||||||
if (name &&
|
if (name &&
|
||||||
maps__set_kallsyms_ref_reloc_sym(machine->vmlinux_maps, name, addr)) {
|
maps__set_kallsyms_ref_reloc_sym(machine->vmlinux_maps, name, addr)) {
|
||||||
machine__destroy_kernel_maps(machine);
|
machine__destroy_kernel_maps(machine);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
machine__set_kernel_mmap(machine, addr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now that we have all the maps created, just set the ->end of them:
|
||||||
|
*/
|
||||||
|
map_groups__fixup_end(&machine->kmaps);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void machine__set_kernel_mmap(struct machine *machine,
|
|
||||||
u64 start, u64 end)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < MAP__NR_TYPES; i++) {
|
|
||||||
machine->vmlinux_maps[i]->start = start;
|
|
||||||
machine->vmlinux_maps[i]->end = end;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Be a bit paranoid here, some perf.data file came with
|
|
||||||
* a zero sized synthesized MMAP event for the kernel.
|
|
||||||
*/
|
|
||||||
if (machine->vmlinux_maps[i]->end == 0)
|
|
||||||
machine->vmlinux_maps[i]->end = ~0ULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool machine__uses_kcore(struct machine *machine)
|
static bool machine__uses_kcore(struct machine *machine)
|
||||||
{
|
{
|
||||||
struct dso *dso;
|
struct dso *dso;
|
||||||
|
|
|
@ -238,7 +238,6 @@ size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp,
|
||||||
bool (skip)(struct dso *dso, int parm), int parm);
|
bool (skip)(struct dso *dso, int parm), int parm);
|
||||||
|
|
||||||
void machine__destroy_kernel_maps(struct machine *machine);
|
void machine__destroy_kernel_maps(struct machine *machine);
|
||||||
int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel);
|
|
||||||
int machine__create_kernel_maps(struct machine *machine);
|
int machine__create_kernel_maps(struct machine *machine);
|
||||||
|
|
||||||
int machines__create_kernel_maps(struct machines *machines, pid_t pid);
|
int machines__create_kernel_maps(struct machines *machines, pid_t pid);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче