s390/cpumf: Use configuration level indication for sampling data
Newer hardware provides the level of virtualization that a particular sample belongs to. Use that information and fall back to the old heuristics if the sample does not contain that information. Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com> Reviewed-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
b4623d4e5b
commit
c19805f870
|
@ -104,7 +104,8 @@ struct hws_basic_entry {
|
||||||
unsigned int P:1; /* 28 PSW Problem state */
|
unsigned int P:1; /* 28 PSW Problem state */
|
||||||
unsigned int AS:2; /* 29-30 PSW address-space control */
|
unsigned int AS:2; /* 29-30 PSW address-space control */
|
||||||
unsigned int I:1; /* 31 entry valid or invalid */
|
unsigned int I:1; /* 31 entry valid or invalid */
|
||||||
unsigned int:16;
|
unsigned int CL:2; /* 32-33 Configuration Level */
|
||||||
|
unsigned int:14;
|
||||||
unsigned int prim_asn:16; /* primary ASN */
|
unsigned int prim_asn:16; /* primary ASN */
|
||||||
unsigned long long ia; /* Instruction Address */
|
unsigned long long ia; /* Instruction Address */
|
||||||
unsigned long long gpp; /* Guest Program Parameter */
|
unsigned long long gpp; /* Guest Program Parameter */
|
||||||
|
|
|
@ -1002,16 +1002,29 @@ static int perf_push_sample(struct perf_event *event, struct sf_raw_sample *sfr)
|
||||||
psw_bits(regs.psw).as = sfr->basic.AS;
|
psw_bits(regs.psw).as = sfr->basic.AS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A non-zero guest program parameter indicates a guest
|
* Use the hardware provided configuration level to decide if the
|
||||||
* sample.
|
* sample belongs to a guest or host. If that is not available,
|
||||||
* Note that some early samples or samples from guests without
|
* fall back to the following heuristics:
|
||||||
|
* A non-zero guest program parameter always indicates a guest
|
||||||
|
* sample. Some early samples or samples from guests without
|
||||||
* lpp usage would be misaccounted to the host. We use the asn
|
* lpp usage would be misaccounted to the host. We use the asn
|
||||||
* value as a heuristic to detect most of these guest samples.
|
* value as an addon heuristic to detect most of these guest samples.
|
||||||
* If the value differs from the host hpp value, we assume
|
* If the value differs from the host hpp value, we assume to be a
|
||||||
* it to be a KVM guest.
|
* KVM guest.
|
||||||
*/
|
*/
|
||||||
if (sfr->basic.gpp || sfr->basic.prim_asn != (u16) sfr->basic.hpp)
|
switch (sfr->basic.CL) {
|
||||||
|
case 1: /* logical partition */
|
||||||
|
sde_regs->in_guest = 0;
|
||||||
|
break;
|
||||||
|
case 2: /* virtual machine */
|
||||||
sde_regs->in_guest = 1;
|
sde_regs->in_guest = 1;
|
||||||
|
break;
|
||||||
|
default: /* old machine, use heuristics */
|
||||||
|
if (sfr->basic.gpp ||
|
||||||
|
sfr->basic.prim_asn != (u16)sfr->basic.hpp)
|
||||||
|
sde_regs->in_guest = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
overflow = 0;
|
overflow = 0;
|
||||||
if (perf_exclude_event(event, ®s, sde_regs))
|
if (perf_exclude_event(event, ®s, sde_regs))
|
||||||
|
|
Loading…
Reference in New Issue