• Lars Persson's avatar
    mm/migrate.c: add missing flush_dcache_page for non-mapped page migrate · 4774a369
    Lars Persson authored
    commit d2b2c6dd227ba5b8a802858748ec9a780cb75b47 upstream.
    
    Our MIPS 1004Kc SoCs were seeing random userspace crashes with SIGILL
    and SIGSEGV that could not be traced back to a userspace code bug.  They
    had all the magic signs of an I/D cache coherency issue.
    
    Now recently we noticed that the /proc/sys/vm/compact_memory interface
    was quite efficient at provoking this class of userspace crashes.
    
    Studying the code in mm/migrate.c there is a distinction made between
    migrating a page that is mapped at the instant of migration and one that
    is not mapped.  Our problem turned out to be the non-mapped pages.
    
    For the non-mapped page the code performs a copy of the page content and
    all relevant meta-data of the page without doing the required D-cache
    maintenance.  This leaves dirty data in the D-cache of the CPU and on
    the 1004K cores this data is not visible to the I-cache.  A subsequent
    page-fault that triggers a mapping of the page will happily serve the
    process with potentially stale code.
    
    What about ARM then, this bug should have seen greater exposure? Well
    ARM became immune to this flaw back in 2010, see commit c0177800
    ("ARM: 6379/1: Assume new page cache pages have dirty D-cache").
    
    My proposed fix moves the D-cache maintenance inside move_to_new_page to
    make it common for both cases.
    
    Link: http://lkml.kernel.org/r/20190315083502.11849-1-larper@axis.com
    Fixes: 97ee0524 ("flush cache before installing new page at migraton")
    Signed-off-by: 's avatarLars Persson <larper@axis.com>
    Reviewed-by: 's avatarPaul Burton <paul.burton@mips.com>
    Acked-by: 's avatarMel Gorman <mgorman@techsingularity.net>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: 's avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: 's avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: 's avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    4774a369