diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-05-09 20:14:07 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-05-09 20:14:07 -0400 |
| commit | 4cc4945844fe2cf493f1783b6ce938ba1617d5c2 (patch) | |
| tree | d4d94f2f4447acf93473ec47de1ef5851fca9f00 | |
| parent | 3ceb0d4438876a65606c258e5d69e03e57460dd6 (diff) | |
perf symbols: Check if a struct machine instance was found
Which can happen when processing old files that had no fake kernel MMAP,
events.
That shouldn't result in perf_session__create_kernel_maps not being
called, this will be fixed in a followup patch, for now do these checks
to avoid segfaulting.
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
| -rw-r--r-- | tools/perf/util/event.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 46563e16c3f5..dfc8bf64d70f 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
| @@ -493,8 +493,10 @@ int event__process_mmap(event_t *self, struct perf_session *session) | |||
| 493 | return 0; | 493 | return 0; |
| 494 | } | 494 | } |
| 495 | 495 | ||
| 496 | thread = perf_session__findnew(session, self->mmap.pid); | ||
| 497 | machine = perf_session__find_host_machine(session); | 496 | machine = perf_session__find_host_machine(session); |
| 497 | if (machine == NULL) | ||
| 498 | goto out_problem; | ||
| 499 | thread = perf_session__findnew(session, self->mmap.pid); | ||
| 498 | map = map__new(&machine->user_dsos, self->mmap.start, | 500 | map = map__new(&machine->user_dsos, self->mmap.start, |
| 499 | self->mmap.len, self->mmap.pgoff, | 501 | self->mmap.len, self->mmap.pgoff, |
| 500 | self->mmap.pid, self->mmap.filename, | 502 | self->mmap.pid, self->mmap.filename, |
| @@ -552,6 +554,10 @@ void thread__find_addr_map(struct thread *self, | |||
| 552 | if (cpumode == PERF_RECORD_MISC_KERNEL && perf_host) { | 554 | if (cpumode == PERF_RECORD_MISC_KERNEL && perf_host) { |
| 553 | al->level = 'k'; | 555 | al->level = 'k'; |
| 554 | machine = perf_session__find_host_machine(session); | 556 | machine = perf_session__find_host_machine(session); |
| 557 | if (machine == NULL) { | ||
| 558 | al->map = NULL; | ||
| 559 | return; | ||
| 560 | } | ||
| 555 | mg = &machine->kmaps; | 561 | mg = &machine->kmaps; |
| 556 | } else if (cpumode == PERF_RECORD_MISC_USER && perf_host) { | 562 | } else if (cpumode == PERF_RECORD_MISC_USER && perf_host) { |
| 557 | al->level = '.'; | 563 | al->level = '.'; |
| @@ -559,7 +565,7 @@ void thread__find_addr_map(struct thread *self, | |||
| 559 | } else if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL && perf_guest) { | 565 | } else if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL && perf_guest) { |
| 560 | al->level = 'g'; | 566 | al->level = 'g'; |
| 561 | machine = perf_session__find_machine(session, pid); | 567 | machine = perf_session__find_machine(session, pid); |
| 562 | if (!machine) { | 568 | if (machine == NULL) { |
| 563 | al->map = NULL; | 569 | al->map = NULL; |
| 564 | return; | 570 | return; |
| 565 | } | 571 | } |
