• Marc Zyngier's avatar
    arm64: KVM: fix 2-level page tables unmapping · 979acd5e
    Marc Zyngier authored
    When using 64kB pages, we only have two levels of page tables,
    meaning that PGD, PUD and PMD are fused. In this case, trying
    to refcount PUDs and PMDs independently is a a complete disaster,
    as they are the same.
    
    We manage to get it right for the allocation (stage2_set_pte uses
    {pmd,pud}_none), but the unmapping path clears both pud and pmd
    refcounts, which fails spectacularly with 2-level page tables.
    
    The fix is to avoid calling clear_pud_entry when both the pmd and
    pud pages are empty. For this, and instead of introducing another
    pud_empty function, consolidate both pte_empty and pmd_empty into
    page_empty (the code is actually identical) and use that to also
    test the validity of the pud.
    Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
    979acd5e
mmu.c 21.4 KB