diff options
author | Zhang, Yanmin <yanmin_zhang@linux.intel.com> | 2010-04-19 01:32:50 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-04-19 05:37:24 -0400 |
commit | a1645ce12adb6c9cc9e19d7695466204e3f017fe (patch) | |
tree | 5d31aaaf534997e6e9cebc07f38eca35f76986cf /tools/perf/builtin-record.c | |
parent | ff9d07a0e7ce756a183e7c2e483aec452ee6b574 (diff) |
perf: 'perf kvm' tool for monitoring guest performance from host
Here is the patch of userspace perf tool.
Signed-off-by: Zhang Yanmin <yanmin_zhang@linux.intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'tools/perf/builtin-record.c')
-rw-r--r-- | tools/perf/builtin-record.c | 63 |
1 files changed, 60 insertions, 3 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index a1b99eeac3c0..27f992aca8b5 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -456,6 +456,52 @@ static void atexit_header(void) | |||
456 | } | 456 | } |
457 | } | 457 | } |
458 | 458 | ||
459 | static void event__synthesize_guest_os(struct kernel_info *kerninfo, | ||
460 | void *data __attribute__((unused))) | ||
461 | { | ||
462 | int err; | ||
463 | char *guest_kallsyms; | ||
464 | char path[PATH_MAX]; | ||
465 | |||
466 | if (is_host_kernel(kerninfo)) | ||
467 | return; | ||
468 | |||
469 | /* | ||
470 | *As for guest kernel when processing subcommand record&report, | ||
471 | *we arrange module mmap prior to guest kernel mmap and trigger | ||
472 | *a preload dso because default guest module symbols are loaded | ||
473 | *from guest kallsyms instead of /lib/modules/XXX/XXX. This | ||
474 | *method is used to avoid symbol missing when the first addr is | ||
475 | *in module instead of in guest kernel. | ||
476 | */ | ||
477 | err = event__synthesize_modules(process_synthesized_event, | ||
478 | session, | ||
479 | kerninfo); | ||
480 | if (err < 0) | ||
481 | pr_err("Couldn't record guest kernel [%d]'s reference" | ||
482 | " relocation symbol.\n", kerninfo->pid); | ||
483 | |||
484 | if (is_default_guest(kerninfo)) | ||
485 | guest_kallsyms = (char *) symbol_conf.default_guest_kallsyms; | ||
486 | else { | ||
487 | sprintf(path, "%s/proc/kallsyms", kerninfo->root_dir); | ||
488 | guest_kallsyms = path; | ||
489 | } | ||
490 | |||
491 | /* | ||
492 | * We use _stext for guest kernel because guest kernel's /proc/kallsyms | ||
493 | * have no _text sometimes. | ||
494 | */ | ||
495 | err = event__synthesize_kernel_mmap(process_synthesized_event, | ||
496 | session, kerninfo, "_text"); | ||
497 | if (err < 0) | ||
498 | err = event__synthesize_kernel_mmap(process_synthesized_event, | ||
499 | session, kerninfo, "_stext"); | ||
500 | if (err < 0) | ||
501 | pr_err("Couldn't record guest kernel [%d]'s reference" | ||
502 | " relocation symbol.\n", kerninfo->pid); | ||
503 | } | ||
504 | |||
459 | static int __cmd_record(int argc, const char **argv) | 505 | static int __cmd_record(int argc, const char **argv) |
460 | { | 506 | { |
461 | int i, counter; | 507 | int i, counter; |
@@ -467,6 +513,7 @@ static int __cmd_record(int argc, const char **argv) | |||
467 | int child_ready_pipe[2], go_pipe[2]; | 513 | int child_ready_pipe[2], go_pipe[2]; |
468 | const bool forks = argc > 0; | 514 | const bool forks = argc > 0; |
469 | char buf; | 515 | char buf; |
516 | struct kernel_info *kerninfo; | ||
470 | 517 | ||
471 | page_size = sysconf(_SC_PAGE_SIZE); | 518 | page_size = sysconf(_SC_PAGE_SIZE); |
472 | 519 | ||
@@ -635,21 +682,31 @@ static int __cmd_record(int argc, const char **argv) | |||
635 | advance_output(err); | 682 | advance_output(err); |
636 | } | 683 | } |
637 | 684 | ||
685 | kerninfo = kerninfo__findhost(&session->kerninfo_root); | ||
686 | if (!kerninfo) { | ||
687 | pr_err("Couldn't find native kernel information.\n"); | ||
688 | return -1; | ||
689 | } | ||
690 | |||
638 | err = event__synthesize_kernel_mmap(process_synthesized_event, | 691 | err = event__synthesize_kernel_mmap(process_synthesized_event, |
639 | session, "_text"); | 692 | session, kerninfo, "_text"); |
640 | if (err < 0) | 693 | if (err < 0) |
641 | err = event__synthesize_kernel_mmap(process_synthesized_event, | 694 | err = event__synthesize_kernel_mmap(process_synthesized_event, |
642 | session, "_stext"); | 695 | session, kerninfo, "_stext"); |
643 | if (err < 0) { | 696 | if (err < 0) { |
644 | pr_err("Couldn't record kernel reference relocation symbol.\n"); | 697 | pr_err("Couldn't record kernel reference relocation symbol.\n"); |
645 | return err; | 698 | return err; |
646 | } | 699 | } |
647 | 700 | ||
648 | err = event__synthesize_modules(process_synthesized_event, session); | 701 | err = event__synthesize_modules(process_synthesized_event, |
702 | session, kerninfo); | ||
649 | if (err < 0) { | 703 | if (err < 0) { |
650 | pr_err("Couldn't record kernel reference relocation symbol.\n"); | 704 | pr_err("Couldn't record kernel reference relocation symbol.\n"); |
651 | return err; | 705 | return err; |
652 | } | 706 | } |
707 | if (perf_guest) | ||
708 | kerninfo__process_allkernels(&session->kerninfo_root, | ||
709 | event__synthesize_guest_os, session); | ||
653 | 710 | ||
654 | if (!system_wide && profile_cpu == -1) | 711 | if (!system_wide && profile_cpu == -1) |
655 | event__synthesize_thread(target_tid, process_synthesized_event, | 712 | event__synthesize_thread(target_tid, process_synthesized_event, |