]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: s390: Fix _gmap_crstep_xchg_atomic()
authorClaudio Imbrenda <imbrenda@linux.ibm.com>
Tue, 2 Jun 2026 14:23:48 +0000 (16:23 +0200)
committerClaudio Imbrenda <imbrenda@linux.ibm.com>
Tue, 2 Jun 2026 14:46:41 +0000 (16:46 +0200)
The previous incorrect behaviour cleared the vsie_notif bit without
returning false, which allowed shadow crstes to be installed without
the vsie_notif bit.

Return false and do not perform the operation if an unshadow event has
been triggered, but still attempt to clear the vsie_notif bit from the
existing crste.

This will prevent the installation of shadow crstes without vsie_notif
bit and will also prevent the caller from looping forever if it was
not checking for the sg->invalidated flag.

Fixes: b827ef02f409 ("KVM: s390: Remove non-atomic dat_crstep_xchg()")
Fixes: a2c17f9270cc ("KVM: s390: New gmap code")
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Message-ID: <20260602142356.169458-3-imbrenda@linux.ibm.com>

arch/s390/kvm/gmap.h

index 742e42a317445e131ab9fd55cd4d62ed15e50c65..5374f21aaf8dfa2cd2259b4c901f3465ba373925 100644 (file)
@@ -273,11 +273,14 @@ static inline bool __must_check _gmap_crstep_xchg_atomic(struct gmap *gmap, unio
                gmap_unmap_prefix(gmap, gfn, gfn + align);
        }
        if (crste_leaf(oldcrste) && crste_needs_unshadow(oldcrste, newcrste)) {
+               newcrste = oldcrste;
                newcrste.s.fc1.vsie_notif = 0;
                if (needs_lock)
                        gmap_handle_vsie_unshadow_event(gmap, gfn);
                else
                        _gmap_handle_vsie_unshadow_event(gmap, gfn);
+               dat_crstep_xchg_atomic(crstep, oldcrste, newcrste, gfn, gmap->asce);
+               return false;
        }
        if (!oldcrste.s.fc1.d && newcrste.s.fc1.d && !newcrste.s.fc1.s)
                SetPageDirty(phys_to_page(crste_origin_large(newcrste)));