KVM: PPC: Book3S HV: Fix handling of secondary HPTEG in HPT resizing code

"Linux Kernel Mailing List" <[email protected]> Sat, 10 Feb 2018 22:00:25 +0000 (UTC)
Newsgroups gmane.linux.kernel.commits.head
Message-ID <[email protected]>
Web:        https://git.kernel.org/torvalds/c/05f2bb0313a2855e491dadfc8319b7da261d7074
Commit:     05f2bb0313a2855e491dadfc8319b7da261d7074
Parent:     57ea5f161a7de5b1913c212d04f57a175b159fdf
Refname:    refs/heads/master
Author:     Paul Mackerras <[email protected]>
AuthorDate: Wed Feb 7 19:49:54 2018 +1100
Committer:  Paul Mackerras <[email protected]>
CommitDate: Fri Feb 9 15:35:24 2018 +1100

    KVM: PPC: Book3S HV: Fix handling of secondary HPTEG in HPT resizing code
    
    This fixes the computation of the HPTE index to use when the HPT
    resizing code encounters a bolted HPTE which is stored in its
    secondary HPTE group.  The code inverts the HPTE group number, which
    is correct, but doesn't then mask it with new_hash_mask.  As a result,
    new_pteg will be effectively negative, resulting in new_hptep
    pointing before the new HPT, which will corrupt memory.
    
    In addition, this removes two BUG_ON statements.  The condition that
    the BUG_ONs were testing -- that we have computed the hash value
    incorrectly -- has never been observed in testing, and if it did
    occur, would only affect the guest, not the host.  Given that
    BUG_ON should only be used in conditions where the kernel (i.e.
    the host kernel, in this case) can't possibly continue execution,
    it is not appropriate here.
    
    Reviewed-by: David Gibson <[email protected]>
    Signed-off-by: Paul Mackerras <[email protected]>
---
 arch/powerpc/kvm/book3s_64_mmu_hv.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
index 966097232d21..d19649960bbf 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
@@ -1329,12 +1329,8 @@ static unsigned long resize_hpt_rehash_hpte(struct kvm_resize_hpt *resize,
 	}
 
 	new_pteg = hash & new_hash_mask;
-	if (vpte & HPTE_V_SECONDARY) {
-		BUG_ON(~pteg != (hash & old_hash_mask));
-		new_pteg = ~new_pteg;
-	} else {
-		BUG_ON(pteg != (hash & old_hash_mask));
-	}
+	if (vpte & HPTE_V_SECONDARY)
+		new_pteg = ~hash & new_hash_mask;
 
 	new_idx = new_pteg * HPTES_PER_GROUP + (idx % HPTES_PER_GROUP);
 	new_hptep = (__be64 *)(new->virt + (new_idx << 4));
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html