• Nicholas Piggin's avatar
    powerpc/64s/radix: Fix huge vmap false positive · 467ba14e
    Nicholas Piggin authored
    pmd_huge() is defined to false when HUGETLB_PAGE is not configured, but
    the vmap code still installs huge PMDs. This leads to false bad PMD
    errors when vunmapping because it is not seen as a huge PTE, and the bad
    PMD check catches it. The end result may not be much more serious than
    some bad pmd warning messages, because the pmd_none_or_clear_bad() does
    what we wanted and clears the huge PTE anyway.
    
    Fix this by checking pmd_is_leaf(), which checks for a PTE regardless of
    config options. The whole huge/large/leaf stuff is a tangled mess but
    that's kernel-wide and not something we can improve much in arch/powerpc
    code.
    
    pmd_page(), pud_page(), etc., called by vmalloc_to_page() on huge vmaps
    can similarly trigger a false VM_BUG_ON when CONFIG_HUGETLB_PAGE=n, so
    those checks are adjusted. The checks were added by commit d6eacedd
    ("powerpc/book3s: Use config independent helpers for page table walk"),
    while implementing a similar fix for other page table walking functions.
    
    Fixes: d909f910 ("powerpc/64s/radix: Enable HAVE_ARCH_HUGE_VMAP")
    Cc: stable@vger.kernel.org # v5.3+
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20211216103342.609192-1-npiggin@gmail.com
    467ba14e
radix_pgtable.c 26.7 KB