• Paul Burton's avatar
    MIPS: Fix detection of unsupported highmem with cache aliases · 058effe7
    Paul Burton authored
    The paging_init() function contains code which detects that highmem is
    in use but unsupported due to dcache aliasing. However this code was
    ineffective because it was being run before the caches are probed,
    meaning that cpu_has_dc_aliases would always evaluate to false (unless a
    platform overrides it to a compile-time constant) and the detection of
    the unsupported case is never triggered. The kernel would then go on to
    attempt to use highmem & either hit coherency issues or trigger the
    BUG_ON in flush_kernel_dcache_page().
    
    Fix this by running paging_init() later than cpu_cache_init(), such that
    the cpu_has_dc_aliases macro will evaluate correctly & the unsupported
    highmem case will be detected successfully.
    
    This then leads to a formerly hidden issue in that
    mem_init_free_highmem() will attempt to free all highmem pages, even
    though we're avoiding use of them & don't have valid page structs for
    them. This leads to an invalid pointer dereference & a TLB exception.
    Avoid this by skipping the loop in mem_init_free_highmem() if
    cpu_has_dc_aliases evaluates true.
    Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
    Cc: Rabin Vincent <rabinv@axis.com>
    Cc: Matt Redfearn <matt.redfearn@imgtec.com>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Alexander Sverdlin <alexander.sverdlin@gmail.com>
    Cc: Aurelien Jarno <aurelien@aurel32.net>
    Cc: Jaedon Shin <jaedon.shin@gmail.com>
    Cc: Toshi Kani <toshi.kani@hpe.com>
    Cc: James Hogan <james.hogan@imgtec.com>
    Cc: Sergey Ryazanov <ryazanov.s.a@gmail.com>
    Cc: Jonas Gorski <jogo@openwrt.org>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: linux-mips@linux-mips.org
    Cc: linux-kernel@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/14184/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    058effe7
init.c 13.2 KB