s390/cpum_sf: Detect KVM guest samples
The host-program-parameter (hpp) value of basic sample-data-entries designates a SIE control block that is set by the LPP instruction in sie64a(). Non-zero values indicate guest samples, a value of zero indicates a host sample. For perf samples, host and guest samples are distinguished using particular PERF_MISC_* flags. The perf layer calls perf_misc_flags() to set the flags based on the pt_regs content. For each sample-data-entry, the cpum_sf PMU creates a pt_regs structure with the sample-data information. An additional flag structure is added to easily distinguish between host and guest samples. Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:

committed by
Martin Schwidefsky

parent
443d4beb82
commit
443e802bab
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Performance event support for s390x
|
||||
*
|
||||
* Copyright IBM Corp. 2012
|
||||
* Copyright IBM Corp. 2012, 2013
|
||||
* Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -89,8 +89,31 @@ static unsigned long perf_misc_guest_flags(struct pt_regs *regs)
|
||||
: PERF_RECORD_MISC_GUEST_KERNEL;
|
||||
}
|
||||
|
||||
static unsigned long perf_misc_flags_sf(struct pt_regs *regs)
|
||||
{
|
||||
struct perf_sf_sde_regs *sde_regs;
|
||||
unsigned long flags;
|
||||
|
||||
sde_regs = (struct perf_sf_sde_regs *) ®s->int_parm_long;
|
||||
if (sde_regs->in_guest)
|
||||
flags = user_mode(regs) ? PERF_RECORD_MISC_GUEST_USER
|
||||
: PERF_RECORD_MISC_GUEST_KERNEL;
|
||||
else
|
||||
flags = user_mode(regs) ? PERF_RECORD_MISC_USER
|
||||
: PERF_RECORD_MISC_KERNEL;
|
||||
return flags;
|
||||
}
|
||||
|
||||
unsigned long perf_misc_flags(struct pt_regs *regs)
|
||||
{
|
||||
/* Check if the cpum_sf PMU has created the pt_regs structure.
|
||||
* In this case, perf misc flags can be easily extracted. Otherwise,
|
||||
* do regular checks on the pt_regs content.
|
||||
*/
|
||||
if (regs->int_code == 0x1407 && regs->int_parm == CPU_MF_INT_SF_PRA)
|
||||
if (!regs->gprs[15])
|
||||
return perf_misc_flags_sf(regs);
|
||||
|
||||
if (is_in_guest(regs))
|
||||
return perf_misc_guest_flags(regs);
|
||||
|
||||
|
Reference in New Issue
Block a user