Currently, if we use perf kvm --guestkallsyms --guestmodules report,
we can not get the perf information from perf data file. The all sample
are shown as unknown.

Reproducing steps:
        # perf kvm --guestkallsyms /tmp/kallsyms --guestmodules /tmp/modules 
record -a sleep 1
        [ perf record: Woken up 1 times to write data ]
        [ perf record: Captured and wrote 0.624 MB perf.data.guest (~27260 
samples) ]
        # perf kvm --guestkallsyms /tmp/kallsyms --guestmodules /tmp/modules 
report |grep %
           100.00%  [guest/6471]  [unknown]         [g] 0xffffffff8164f330

This bug is caused when delivery sample. We use 
perf_session__find_machine_for_cpumode() to find
the machine, and it call perf_session__findnew_machine(). Then we will delivery 
the sample to a
new machine without kernel mapped.

This patch changes perf_session__findnew_machine() to 
perf_session__find_machine(), so the sample
will be deliveried to default guest machine if there is no machine specified 
for it.

Verify steps:
        # ./perf kvm --guestkallsyms /home/kallsyms --guestmodules 
/home/modules record -a sleep 1
        [ perf record: Woken up 1 times to write data ]
        [ perf record: Captured and wrote 0.651 MB perf.data.guest (~28437 
samples) ]
        # ./perf kvm --guestkallsyms /home/kallsyms --guestmodules 
/home/modules report |grep %
            22.64%    :6471  [guest.kernel.kallsyms]  [g] 
update_rq_clock.part.70
            19.99%    :6471  [guest.kernel.kallsyms]  [g] d_free
            18.46%    :6471  [guest.kernel.kallsyms]  [g] bio_phys_segments
            16.25%    :6471  [guest.kernel.kallsyms]  [g] dequeue_task
            12.78%    :6471  [guest.kernel.kallsyms]  [g] __switch_to
             7.91%    :6471  [guest.kernel.kallsyms]  [g] scheduler_tick
             1.75%    :6471  [guest.kernel.kallsyms]  [g] native_apic_mem_write
             0.21%    :6471  [guest.kernel.kallsyms]  [g] apic_timer_interrupt

Signed-off-by: Dongsheng Yang <yangds.f...@cn.fujitsu.com>
---
 tools/perf/util/session.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 8a7da6f..1770f2f 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -851,6 +851,7 @@ static struct machine *
                                               struct perf_sample *sample)
 {
        const u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
+       struct machine *machine;
 
        if (perf_guest &&
            ((cpumode == PERF_RECORD_MISC_GUEST_KERNEL) ||
@@ -863,7 +864,11 @@ static struct machine *
                else
                        pid = sample->pid;
 
-               return perf_session__findnew_machine(session, pid);
+               machine = perf_session__find_machine(session, pid);
+               if (!machine)
+                       machine = perf_session__findnew_machine(session,
+                                               DEFAULT_GUEST_KERNEL_ID);
+               return machine;
        }
 
        return &session->machines.host;
-- 
1.8.2.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to