]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: s390: vsie: Avoid potential deadlock with real spaces
authorClaudio Imbrenda <imbrenda@linux.ibm.com>
Thu, 2 Jul 2026 15:23:59 +0000 (17:23 +0200)
committerChristian Borntraeger <borntraeger@linux.ibm.com>
Thu, 9 Jul 2026 08:26:10 +0000 (10:26 +0200)
The natural lock ordering is mmu_lock -> children_lock, but in
gmap_create_shadow() the reverse order is used when handling shadowing
of real address spaces.

Convert the inner locking of kvm->mmu_lock to a trylock; return -EAGAIN
if the lock is busy, and let the caller try again.

This path is not expected to happen in real-life scenarios, so its
performance is not important.

Fixes: a2c17f9270cc ("KVM: s390: New gmap code")
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
arch/s390/kvm/gmap.c

index 298fbaecec28d543a0ef07708cd32912d7b14924..8abb4f55b306ba30018ce98a465fc4ca2032a93f 100644 (file)
@@ -1374,8 +1374,13 @@ struct gmap *gmap_create_shadow(struct kvm_s390_mmu_cache *mc, struct gmap *pare
                        /* Only allow one real-space gmap shadow. */
                        list_for_each_entry(sg, &parent->children, list) {
                                if (sg->guest_asce.r) {
-                                       scoped_guard(write_lock, &parent->kvm->mmu_lock)
+                                       if (write_trylock(&parent->kvm->mmu_lock)) {
                                                gmap_unshadow(sg);
+                                               write_unlock(&parent->kvm->mmu_lock);
+                                       } else {
+                                               gmap_put(new);
+                                               return ERR_PTR(-EAGAIN);
+                                       }
                                        break;
                                }
                        }