| From 56ee8ce78cb5501cb162bd3d3d13cd20321712bc Mon Sep 17 00:00:00 2001 |
| From: Michael Roth <mdroth@linux.vnet.ibm.com> |
| Date: Tue, 10 Mar 2020 16:11:28 -0500 |
| Subject: [PATCH] KVM: PPC: Book3S HV: Fix H_CEDE return code for nested guests |
| |
| commit 1f50cc1705350a4697923203fedd7d8fb1087fe2 upstream. |
| |
| The h_cede_tm kvm-unit-test currently fails when run inside an L1 guest |
| via the guest/nested hypervisor. |
| |
| ./run-tests.sh -v |
| ... |
| TESTNAME=h_cede_tm TIMEOUT=90s ACCEL= ./powerpc/run powerpc/tm.elf -smp 2,threads=2 -machine cap-htm=on -append "h_cede_tm" |
| FAIL h_cede_tm (2 tests, 1 unexpected failures) |
| |
| While the test relates to transactional memory instructions, the actual |
| failure is due to the return code of the H_CEDE hypercall, which is |
| reported as 224 instead of 0. This happens even when no TM instructions |
| are issued. |
| |
| 224 is the value placed in r3 to execute a hypercall for H_CEDE, and r3 |
| is where the caller expects the return code to be placed upon return. |
| |
| In the case of guest running under a nested hypervisor, issuing H_CEDE |
| causes a return from H_ENTER_NESTED. In this case H_CEDE is |
| specially-handled immediately rather than later in |
| kvmppc_pseries_do_hcall() as with most other hcalls, but we forget to |
| set the return code for the caller, hence why kvm-unit-test sees the |
| 224 return code and reports an error. |
| |
| Guest kernels generally don't check the return value of H_CEDE, so |
| that likely explains why this hasn't caused issues outside of |
| kvm-unit-tests so far. |
| |
| Fix this by setting r3 to 0 after we finish processing the H_CEDE. |
| |
| RHBZ: 1778556 |
| |
| Fixes: 4bad77799fed ("KVM: PPC: Book3S HV: Handle hypercalls correctly when nested") |
| Cc: linuxppc-dev@ozlabs.org |
| Cc: David Gibson <david@gibson.dropbear.id.au> |
| Cc: Paul Mackerras <paulus@ozlabs.org> |
| Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> |
| Reviewed-by: David Gibson <david@gibson.dropbear.id.au> |
| Signed-off-by: Paul Mackerras <paulus@ozlabs.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c |
| index a46f93045fea..cc4279bc6da6 100644 |
| --- a/arch/powerpc/kvm/book3s_hv.c |
| +++ b/arch/powerpc/kvm/book3s_hv.c |
| @@ -3620,6 +3620,7 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, |
| if (trap == BOOK3S_INTERRUPT_SYSCALL && !vcpu->arch.nested && |
| kvmppc_get_gpr(vcpu, 3) == H_CEDE) { |
| kvmppc_nested_cede(vcpu); |
| + kvmppc_set_gpr(vcpu, 3, 0); |
| trap = 0; |
| } |
| } else { |
| -- |
| 2.7.4 |
| |