Commit a488e753 authored by Claudio Imbrenda's avatar Claudio Imbrenda
Browse files

KVM: s390: vsie: Fix redundant rmap entries



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: default avatarClaudio Imbrenda <imbrenda@linux.ibm.com>
Fixes: a2c17f92 ("KVM: s390: New gmap code")
Reviewed-by: default avatarChristian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@linux.ibm.com>
parent 2d505c29
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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;