]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: s390: vsie: Fix the initialization of the epoch extension (epdx) field
authorThomas Huth <thuth@redhat.com>
Wed, 23 Nov 2022 09:08:33 +0000 (10:08 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Dec 2022 10:30:43 +0000 (11:30 +0100)
commit 0dd4cdccdab3d74bd86b868768a7dca216bcce7e upstream.

We recently experienced some weird huge time jumps in nested guests when
rebooting them in certain cases. After adding some debug code to the epoch
handling in vsie.c (thanks to David Hildenbrand for the idea!), it was
obvious that the "epdx" field (the multi-epoch extension) did not get set
to 0xff in case the "epoch" field was negative.
Seems like the code misses to copy the value from the epdx field from
the guest to the shadow control block. By doing so, the weird time
jumps are gone in our scenarios.

Link: https://bugzilla.redhat.com/show_bug.cgi?id=2140899
Fixes: 81274e7131c3 ("KVM: s390: Multiple Epoch Facility support")
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Cc: stable@vger.kernel.org # 4.19+
Link: https://lore.kernel.org/r/20221123090833.292938-1-thuth@redhat.com
Message-Id: <20221123090833.292938-1-thuth@redhat.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/s390/kvm/vsie.c

index 4f6c22d72072ade872f638a704dab39aa38d2a42..2021946176de8f00f1076350192a29bf13f5b0fc 100644 (file)
@@ -540,8 +540,10 @@ static int shadow_scb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
        if (test_kvm_cpu_feat(vcpu->kvm, KVM_S390_VM_CPU_FEAT_CEI))
                scb_s->eca |= scb_o->eca & ECA_CEI;
        /* Epoch Extension */
-       if (test_kvm_facility(vcpu->kvm, 139))
+       if (test_kvm_facility(vcpu->kvm, 139)) {
                scb_s->ecd |= scb_o->ecd & ECD_MEF;
+               scb_s->epdx = scb_o->epdx;
+       }
 
        /* etoken */
        if (test_kvm_facility(vcpu->kvm, 156))