Suraj Jitindar Singh <sjitindarsi...@gmail.com> writes: > 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"
I'm not clear why this and the next commit are marked as fixing the above commit. Wasn't it broken prior to that commit as well? cheers > Signed-off-by: Suraj Jitindar Singh <sjitindarsi...@gmail.com> > --- > arch/powerpc/kvm/book3s_hv.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c > index ec1804f822af..b682a429f3ef 100644 > --- a/arch/powerpc/kvm/book3s_hv.c > +++ b/arch/powerpc/kvm/book3s_hv.c > @@ -3654,6 +3654,8 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 > time_limit, > vcpu->arch.vpa.dirty = 1; > save_pmu = lp->pmcregs_in_use; > } > + /* Must save pmu if this guest is capable of running nested guests */ > + save_pmu |= nesting_enabled(vcpu->kvm); > > kvmhv_save_guest_pmu(vcpu, save_pmu); > > -- > 2.13.6