| From 44bada28219031f9e8e86b84460606efa57b871e Mon Sep 17 00:00:00 2001 |
| From: Heiko Carstens <hca@linux.ibm.com> |
| Date: Thu, 15 Apr 2021 10:01:27 +0200 |
| Subject: KVM: s390: fix guarded storage control register handling |
| |
| From: Heiko Carstens <hca@linux.ibm.com> |
| |
| commit 44bada28219031f9e8e86b84460606efa57b871e upstream. |
| |
| store_regs_fmt2() has an ordering problem: first the guarded storage |
| facility is enabled on the local cpu, then preemption disabled, and |
| then the STGSC (store guarded storage controls) instruction is |
| executed. |
| |
| If the process gets scheduled away between enabling the guarded |
| storage facility and before preemption is disabled, this might lead to |
| a special operation exception and therefore kernel crash as soon as |
| the process is scheduled back and the STGSC instruction is executed. |
| |
| Fixes: 4e0b1ab72b8a ("KVM: s390: gs support for kvm guests") |
| Signed-off-by: Heiko Carstens <hca@linux.ibm.com> |
| Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Reviewed-by: David Hildenbrand <david@redhat.com> |
| Reviewed-by: Janosch Frank <frankja@linux.ibm.com> |
| Reviewed-by: Cornelia Huck <cohuck@redhat.com> |
| Cc: <stable@vger.kernel.org> # 4.12 |
| Link: https://lore.kernel.org/r/20210415080127.1061275-1-hca@linux.ibm.com |
| Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/s390/kvm/kvm-s390.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/s390/kvm/kvm-s390.c |
| +++ b/arch/s390/kvm/kvm-s390.c |
| @@ -4310,16 +4310,16 @@ static void store_regs_fmt2(struct kvm_v |
| kvm_run->s.regs.bpbc = (vcpu->arch.sie_block->fpf & FPF_BPBC) == FPF_BPBC; |
| kvm_run->s.regs.diag318 = vcpu->arch.diag318_info.val; |
| if (MACHINE_HAS_GS) { |
| + preempt_disable(); |
| __ctl_set_bit(2, 4); |
| if (vcpu->arch.gs_enabled) |
| save_gs_cb(current->thread.gs_cb); |
| - preempt_disable(); |
| current->thread.gs_cb = vcpu->arch.host_gscb; |
| restore_gs_cb(vcpu->arch.host_gscb); |
| - preempt_enable(); |
| if (!vcpu->arch.host_gscb) |
| __ctl_clear_bit(2, 4); |
| vcpu->arch.host_gscb = NULL; |
| + preempt_enable(); |
| } |
| /* SIE will save etoken directly into SDNX and therefore kvm_run */ |
| } |