perf kvm: Fix segfault with report and mixed guestmount use
Using the guestmount option on record: $ perf kvm --guest --host --guestmount=/tmp/guest-mount record -ag But not the subsequent report: $ perf kvm report causes a SEGFAULT in the usual place: (gdb) bt 0 0x0000000000470356 in machine__mmap_name (self=0x0, bf=0x7fffffffbdb0 " z\370\367\377\177", size= 4096) at util/map.c:712 1 0x00000000004453e8 in perf_event__process_kernel_mmap (tool=0x7fffffffde10, event=0x7ffff7f87e38, machine=0x0) at util/event.c:550 2 0x00000000004458c9 in perf_event__process_mmap (tool=0x7fffffffde10, event=0x7ffff7f87e38, sample= 0x7fffffffd2a0, machine=0x0) at util/event.c:656 3 0x00000000004733e0 in perf_session_deliver_event (session=0x91aca0, event=0x7ffff7f87e38, sample= 0x7fffffffd2a0, tool=0x7fffffffde10, file_offset=7736) at util/session.c:979 ... The MMAP events in this case already contain the full path to the module. No need to require it for the report path to. Signed-off-by: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1341241977-71535-1-git-send-email-dsahern@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
207b579269
Коммит
7ed97ad41f
|
@ -669,24 +669,25 @@ struct machine *machines__find(struct rb_root *self, pid_t pid)
|
||||||
struct machine *machines__findnew(struct rb_root *self, pid_t pid)
|
struct machine *machines__findnew(struct rb_root *self, pid_t pid)
|
||||||
{
|
{
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
const char *root_dir;
|
const char *root_dir = "";
|
||||||
struct machine *machine = machines__find(self, pid);
|
struct machine *machine = machines__find(self, pid);
|
||||||
|
|
||||||
if (!machine || machine->pid != pid) {
|
if (machine && (machine->pid == pid))
|
||||||
if (pid == HOST_KERNEL_ID || pid == DEFAULT_GUEST_KERNEL_ID)
|
|
||||||
root_dir = "";
|
|
||||||
else {
|
|
||||||
if (!symbol_conf.guestmount)
|
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
if ((pid != HOST_KERNEL_ID) &&
|
||||||
|
(pid != DEFAULT_GUEST_KERNEL_ID) &&
|
||||||
|
(symbol_conf.guestmount)) {
|
||||||
sprintf(path, "%s/%d", symbol_conf.guestmount, pid);
|
sprintf(path, "%s/%d", symbol_conf.guestmount, pid);
|
||||||
if (access(path, R_OK)) {
|
if (access(path, R_OK)) {
|
||||||
pr_err("Can't access file %s\n", path);
|
pr_err("Can't access file %s\n", path);
|
||||||
|
machine = NULL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
root_dir = path;
|
root_dir = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
machine = machines__add(self, pid, root_dir);
|
machine = machines__add(self, pid, root_dir);
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return machine;
|
return machine;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче