• Suzuki K Poulose's avatar
    KVM: arm/arm64: Fix handling of stage2 huge mappings · 3c3736cd
    Suzuki K Poulose authored
    We rely on the mmu_notifier call backs to handle the split/merge
    of huge pages and thus we are guaranteed that, while creating a
    block mapping, either the entire block is unmapped at stage2 or it
    is missing permission.
    
    However, we miss a case where the block mapping is split for dirty
    logging case and then could later be made block mapping, if we cancel the
    dirty logging. This not only creates inconsistent TLB entries for
    the pages in the the block, but also leakes the table pages for
    PMD level.
    
    Handle this corner case for the huge mappings at stage2 by
    unmapping the non-huge mapping for the block. This could potentially
    release the upper level table. So we need to restart the table walk
    once we unmap the range.
    
    Fixes : ad361f09 ("KVM: ARM: Support hugetlbfs backed huge pages")
    Reported-by: default avatarZheng Xiang <zhengxiang9@huawei.com>
    Cc: Zheng Xiang <zhengxiang9@huawei.com>
    Cc: Zenghui Yu <yuzenghui@huawei.com>
    Cc: Christoffer Dall <christoffer.dall@arm.com>
    Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
    Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    3c3736cd
stage2_pgtable.h 2.77 KB