perf kvm: fix segfault with report and mixed guestmount use
PATCH 1/1 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.
--- tools/perf/util/map.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-)
tools/perf/util/map.c +15 -14
@@ -669,25 +669,26 @@ struct machine *machines__find(struct rb_root *self, pid_t pid)struct machine *machines__findnew (struct rb_root *self,pid_t pid) {char path[PATH_MAX ]; -const char *root_dir; +const char *root_dir ="" ;struct machine *machine =machines__find (self, 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; -sprintf (path,"%s/%d" , symbol_conf.guestmount, pid); -if (access (path,R_OK )) { -pr_err ("Can't access file %s\n" , path); - goto out; - } - root_dir = path; +if (machine && (machine->pid == pid)) + goto out; + +if ((pid !=HOST_KERNEL_ID ) && + (pid !=DEFAULT_GUEST_KERNEL_ID ) && + (symbol_conf.guestmount)) { +sprintf (path,"%s/%d" , symbol_conf.guestmount, pid); +if (access (path,R_OK )) { +pr_err ("Can't access file %s\n" , path); + machine =NULL ; + goto out; } - machine =machines__add (self, pid, root_dir); + root_dir = path; } + machine =machines__add (self, pid, root_dir); + out:return machine; }
Signature · 1 line
1.7.10.1
[tip:perf/urgent] perf kvm: Fix segfault with report and mixed guestmount use
Commit-ID: 7ed97ad41ffa94040dfd593948962a7e9e7b0db9 Gitweb: http://git.kernel.org/tip/7ed97ad41ffa94040dfd593948962a7e9e7b0db9 Author: David Ahern <[email protected]> AuthorDate: Mon, 2 Jul 2012 09:12:57 -0600 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 2 Jul 2012 14:03:50 -0300
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.
--- tools/perf/util/map.c | 29 +++++++++++++++-------------- 1 files changed, 15 insertions(+), 14 deletions(-)
tools/perf/util/map.c +15 -14
@@ -669,25 +669,26 @@ struct machine *machines__find(struct rb_root *self, pid_t pid)struct machine *machines__findnew (struct rb_root *self,pid_t pid) {char path[PATH_MAX ]; -const char *root_dir; +const char *root_dir ="" ;struct machine *machine =machines__find (self, 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; -sprintf (path,"%s/%d" , symbol_conf.guestmount, pid); -if (access (path,R_OK )) { -pr_err ("Can't access file %s\n" , path); - goto out; - } - root_dir = path; +if (machine && (machine->pid == pid)) + goto out; + +if ((pid !=HOST_KERNEL_ID ) && + (pid !=DEFAULT_GUEST_KERNEL_ID ) && + (symbol_conf.guestmount)) { +sprintf (path,"%s/%d" , symbol_conf.guestmount, pid); +if (access (path,R_OK )) { +pr_err ("Can't access file %s\n" , path); + machine =NULL ; + goto out; } - machine =machines__add (self, pid, root_dir); + root_dir = path; } + machine =machines__add (self, pid, root_dir); + out:return machine; }