lkml.org 
[lkml]   [2018]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.15 174/189] KVM: PPC: Book3S HV: Fix handling of secondary HPTEG in HPT resizing code
    Date
    From: Paul Mackerras <paulus@ozlabs.org>

    [ Upstream commit 05f2bb0313a2855e491dadfc8319b7da261d7074 ]

    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 <david@gibson.dropbear.id.au>
    Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    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 b73dbc9e797d..dc0f2ade589e 100644
    --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
    +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
    @@ -1337,12 +1337,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));
    --
    2.15.1
    \
     
     \ /
      Last update: 2018-04-09 05:34    [W:4.104 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site