| From 63279eeb7f93abb1692573c26f1e038e1a87358b Mon Sep 17 00:00:00 2001 |
| From: Suraj Jitindar Singh <sjitindarsingh@gmail.com> |
| Date: Wed, 3 Jul 2019 11:20:20 +1000 |
| Subject: KVM: PPC: Book3S HV: Always save guest pmu for guest capable of nesting |
| |
| From: Suraj Jitindar Singh <sjitindarsingh@gmail.com> |
| |
| commit 63279eeb7f93abb1692573c26f1e038e1a87358b upstream. |
| |
| 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") |
| Cc: stable@vger.kernel.org # v4.20+ |
| Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20190703012022.15644-1-sjitindarsingh@gmail.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/kvm/book3s_hv.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- 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->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); |
| |