]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: s390: vsie: Fix redundant rmap entries
authorClaudio Imbrenda <imbrenda@linux.ibm.com>
Tue, 19 May 2026 15:01:13 +0000 (17:01 +0200)
committerClaudio Imbrenda <imbrenda@linux.ibm.com>
Fri, 22 May 2026 09:25:11 +0000 (11:25 +0200)
The address passed to the gmap rmap was not being masked. As a
consequence several different (but functionally equivalent) rmap
entries were being created for each shadowed table.

Fix this by properly masking the address depending on the table level.

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

index 8cff0cf5ce24e0218cf2fd1ef66aa705c92ff75d..957126ab991ca5182d62acf011d43778675dc12f 100644 (file)
@@ -1025,6 +1025,7 @@ int gmap_insert_rmap(struct gmap *sg, gfn_t p_gfn, gfn_t r_gfn, int level)
 int gmap_protect_rmap(struct kvm_s390_mmu_cache *mc, struct gmap *sg, gfn_t p_gfn, gfn_t r_gfn,
                      kvm_pfn_t pfn, int level, bool wr)
 {
+       unsigned long bitmask;
        union crste *crstep;
        union pgste pgste;
        union pte *ptep;
@@ -1041,8 +1042,9 @@ int gmap_protect_rmap(struct kvm_s390_mmu_cache *mc, struct gmap *sg, gfn_t p_gf
        if (rc)
                return rc;
        if (level <= TABLE_TYPE_REGION1) {
+               bitmask = -1UL << (8 + 11 * level);
                scoped_guard(spinlock, &sg->host_to_rmap_lock)
-                       rc = gmap_insert_rmap(sg, p_gfn, r_gfn, level);
+                       rc = gmap_insert_rmap(sg, p_gfn, r_gfn & bitmask, level);
        }
        if (rc)
                return rc;