]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: s390: vsie: Fix rmap handling in _do_shadow_crste()
authorClaudio Imbrenda <imbrenda@linux.ibm.com>
Tue, 2 Jun 2026 14:23:51 +0000 (16:23 +0200)
committerClaudio Imbrenda <imbrenda@linux.ibm.com>
Tue, 2 Jun 2026 14:46:41 +0000 (16:46 +0200)
Fix _do_shadow_crste() to also apply a mask on the reverse address, to
prevent spurious entries from being created, like already done in
gmap_protect_rmap().

Fixes: e38c884df921 ("KVM: s390: Switch to new gmap")
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Message-ID: <20260602142356.169458-6-imbrenda@linux.ibm.com>

arch/s390/kvm/gaccess.c

index 4f8d5592c9a92c017df2a4e3761fb81920efca0e..20e28b183c1ac047e70fab3228c7c4772ca71a7a 100644 (file)
@@ -1466,15 +1466,17 @@ static int _do_shadow_crste(struct gmap *sg, gpa_t raddr, union crste *host, uni
                            struct guest_fault *f, bool p)
 {
        union crste newcrste, oldcrste;
-       gfn_t gfn;
+       unsigned long mask;
+       gfn_t r_gfn;
        int rc;
 
        lockdep_assert_held(&sg->kvm->mmu_lock);
        lockdep_assert_held(&sg->parent->children_lock);
 
-       gfn = f->gfn & (is_pmd(*table) ? _SEGMENT_FR_MASK : _REGION3_FR_MASK);
+       mask = is_pmd(*table) ? _SEGMENT_FR_MASK : _REGION3_FR_MASK;
+       r_gfn = gpa_to_gfn(raddr) & mask;
        scoped_guard(spinlock, &sg->host_to_rmap_lock)
-               rc = gmap_insert_rmap(sg, gfn, gpa_to_gfn(raddr), host->h.tt);
+               rc = gmap_insert_rmap(sg, f->gfn & mask, r_gfn, host->h.tt);
        if (rc)
                return rc;
 
@@ -1497,8 +1499,7 @@ static int _do_shadow_crste(struct gmap *sg, gpa_t raddr, union crste *host, uni
                return -EAGAIN;
 
        newcrste = _crste_fc1(f->pfn, oldcrste.h.tt, 0, !p);
-       gfn = gpa_to_gfn(raddr);
-       while (!dat_crstep_xchg_atomic(table, READ_ONCE(*table), newcrste, gfn, sg->asce))
+       while (!dat_crstep_xchg_atomic(table, READ_ONCE(*table), newcrste, r_gfn, sg->asce))
                ;
        return 0;
 }