• Linus Torvalds's avatar
    Fix OOPS in mmap_region() when merging adjacent VM_LOCKED file segments · de33c8db
    Linus Torvalds authored
    As of commit ba470de4 ("map: handle
    mlocked pages during map, remap, unmap") we now use the 'vma' variable
    at the end of mmap_region() to handle the page-in of newly mapped
    mlocked pages.
    
    However, if we merged adjacent vma's together, the vma we're using may
    be stale.  We historically consciously avoided using it after the merge
    operation, but that got overlooked when redoing the locked page
    handling.
    
    This commit simplifies mmap_region() by doing any vma merges early,
    avoiding the issue entirely, and 'vma' will always be valid.  As pointed
    out by Hugh Dickins, this depends on any drivers that change the page
    offset of flags to have set one of the VM_SPECIAL bits (so that they
    cannot trigger the early merge logic), but that's true in general.
    Reported-and-tested-by: default avatarMaksim Yevmenkin <maksim.yevmenkin@gmail.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
    Cc: Nick Piggin <npiggin@suse.de>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Hugh Dickins <hugh@veritas.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    de33c8db
mmap.c 64.1 KB