perf: Enhance perf to allow for guest statistic collection from host
Below patch introduces perf_guest_info_callbacks and related register/unregister functions. Add more PERF_RECORD_MISC_XXX bits meaning guest kernel and guest user space. Signed-off-by: Zhang Yanmin <yanmin_zhang@linux.intel.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
committed by
Avi Kivity
parent
b5a80b7e91
commit
39447b386c
@ -1720,6 +1720,11 @@ struct perf_callchain_entry *perf_callchain(struct pt_regs *regs)
|
||||
{
|
||||
struct perf_callchain_entry *entry;
|
||||
|
||||
if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
|
||||
/* TODO: We don't support guest os callchain now */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (in_nmi())
|
||||
entry = &__get_cpu_var(pmc_nmi_entry);
|
||||
else
|
||||
@ -1743,3 +1748,29 @@ void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int ski
|
||||
regs->cs = __KERNEL_CS;
|
||||
local_save_flags(regs->flags);
|
||||
}
|
||||
|
||||
unsigned long perf_instruction_pointer(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long ip;
|
||||
if (perf_guest_cbs && perf_guest_cbs->is_in_guest())
|
||||
ip = perf_guest_cbs->get_guest_ip();
|
||||
else
|
||||
ip = instruction_pointer(regs);
|
||||
return ip;
|
||||
}
|
||||
|
||||
unsigned long perf_misc_flags(struct pt_regs *regs)
|
||||
{
|
||||
int misc = 0;
|
||||
if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
|
||||
misc |= perf_guest_cbs->is_user_mode() ?
|
||||
PERF_RECORD_MISC_GUEST_USER :
|
||||
PERF_RECORD_MISC_GUEST_KERNEL;
|
||||
} else
|
||||
misc |= user_mode(regs) ? PERF_RECORD_MISC_USER :
|
||||
PERF_RECORD_MISC_KERNEL;
|
||||
if (regs->flags & PERF_EFLAGS_EXACT)
|
||||
misc |= PERF_RECORD_MISC_EXACT;
|
||||
|
||||
return misc;
|
||||
}
|
||||
|
Reference in New Issue
Block a user