Re: [PATCH 1/3] perf, tool: Force guest machine definition option

From: David Ahern
Date: Sun Apr 15 2012 - 17:32:42 EST


On 4/15/12 8:05 AM, Jiri Olsa wrote:
how about the patch below? it ensures there's machine record for
the guest. The segfault issue still stays..

jirka

---
Running 'perf kvm record' without any of following options:
--guestmount
--guestvmlinux
--guestkallsyms
--guestmodules

is causing the guest machine to be ommited from the data file,
and all guest samples are counted in nr_unprocessable_samples.

This patch makes sure the 'perf kvm record' command is not
let through if guest machine isn't defined.


Doesn't work: it requires a 'default' vmlinux/modules/kallsyms even when a proper guestmount has been specified.

Today guestmount works for the report path because of the hook in machines__findnew() which creates a machine on first lookup. Really, the guestmount argument should not be required for the report which could be using a local symbol tree (symfs argument) -- e.g., capture on a host OS which could have kallsyms/module information for each VM / VM being profiled and then report file taken to another system for analysis where that system has access to symbols.

Perhaps what is needed is for the machine to be created for the pid == DEFAULT_GUEST_KERNEL_ID on first need. This is not the right place -- but shows the sentiment:

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 1efd3be..20420fc 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -824,6 +824,7 @@ static struct machine *
perf_session__find_machine_for_cpumode(struct perf_session *session,
union perf_event *event)
{
+ struct machine *mach;
const u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;

if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL && perf_guest) {
@@ -834,7 +835,10 @@ static struct machine *
else
pid = event->ip.pid;

- return perf_session__find_machine(session, pid);
+ mach = perf_session__find_machine(session, pid);
+ if (!mach && pid == 0)
+ mach = machines__add(&session->machines, pid, "/dev/null");
+ return mach;
}

return perf_session__find_host_machine(session);

So basically it allows kernel maps to be attached to a pid 0 machine but that machine has no tree for further symbols. If nothing else perf-kvm does not segfault.

I am seeing other problems with perf-kvm too. e.g.,
perf kvm --guest --host --guestmount /tmp/guestmount record -p 21234 -- sleep 10


Dumping the samples:
perf script -i perf.data.guest
--> shows no samples (2 'openssl speed' commands are running in the 2-vcpu guest so something should be generated)

perf script -i perf.data.kvm

Failed to open [guest.kernel.kallsyms.21234]_text, continuing without symbols
qemu-kvm 21234 cycles: ffffffff8103edaa [unknown] ([guest.kernel.kallsyms.21234]_text)

Anyways, perf-kvm needs some love. Gotta run.

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