On Wed, 2019-07-03 at 01:20:20 UTC, Suraj Jitindar Singh wrote: > The performance monitoring unit (PMU) registers are saved on guest exit > when the guest has set the pmcregs_in_use flag in its lppaca, if it > exists, or unconditionally if it doesn't. If a nested guest is being > run then the hypervisor doesn't, and in most cases can't, know if the > pmu registers are in use since it doesn't know the location of the lppaca > for the nested guest, although it may have one for its immediate guest. > This results in the values of these registers being lost across nested > guest entry and exit in the case where the nested guest was making use > of the performance monitoring facility while it's nested guest hypervisor > wasn't. > > Further more the hypervisor could interrupt a guest hypervisor between > when it has loaded up the pmu registers and it calling H_ENTER_NESTED or > between returning from the nested guest to the guest hypervisor and the > guest hypervisor reading the pmu registers, in kvmhv_p9_guest_entry(). > This means that it isn't sufficient to just save the pmu registers when > entering or exiting a nested guest, but that it is necessary to always > save the pmu registers whenever a guest is capable of running nested guests > to ensure the register values aren't lost in the context switch. > > Ensure the pmu register values are preserved by always saving their > value into the vcpu struct when a guest is capable of running nested > guests. > > This should have minimal performance impact however any impact can be > avoided by booting a guest with "-machine pseries,cap-nested-hv=false" > on the qemu commandline. > > Fixes: 95a6432ce903 "KVM: PPC: Book3S HV: Streamlined guest entry/exit path on P9 for radix guests" > > Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@xxxxxxxxx> Series applied to powerpc fixes, thanks. https://git.kernel.org/powerpc/c/63279eeb7f93abb1692573c26f1e038e1a87358b cheers