Skip to content
  • Mel Gorman's avatar
    mm: migration: avoid race between shift_arg_pages() and rmap_walk() during... · a8bef8ff
    Mel Gorman authored
    mm: migration: avoid race between shift_arg_pages() and rmap_walk() during migration by not migrating temporary stacks
    
    Page migration requires rmap to be able to find all ptes mapping a page
    at all times, otherwise the migration entry can be instantiated, but it
    is possible to leave one behind if the second rmap_walk fails to find
    the page.  If this page is later faulted, migration_entry_to_page() will
    call BUG because the page is locked indicating the page was migrated by
    the migration PTE not cleaned up. For example
    
      kernel BUG at include/linux/swapops.h:105!
      invalid opcode: 0000 [#1
    
    ] PREEMPT SMP
      ...
      Call Trace:
       [<ffffffff810e951a>] handle_mm_fault+0x3f8/0x76a
       [<ffffffff8130c7a2>] do_page_fault+0x44a/0x46e
       [<ffffffff813099b5>] page_fault+0x25/0x30
       [<ffffffff8114de33>] load_elf_binary+0x152a/0x192b
       [<ffffffff8111329b>] search_binary_handler+0x173/0x313
       [<ffffffff81114896>] do_execve+0x219/0x30a
       [<ffffffff8100a5c6>] sys_execve+0x43/0x5e
       [<ffffffff8100320a>] stub_execve+0x6a/0xc0
      RIP  [<ffffffff811094ff>] migration_entry_wait+0xc1/0x129
    
    There is a race between shift_arg_pages and migration that triggers this
    bug.  A temporary stack is setup during exec and later moved.  If
    migration moves a page in the temporary stack and the VMA is then removed
    before migration completes, the migration PTE may not be found leading to
    a BUG when the stack is faulted.
    
    This patch causes pages within the temporary stack during exec to be
    skipped by migration.  It does this by marking the VMA covering the
    temporary stack with an otherwise impossible combination of VMA flags.
    These flags are cleared when the temporary stack is moved to its final
    location.
    
    [kamezawa.hiroyu@jp.fujitsu.com: idea for having migration skip temporary stacks]
    Signed-off-by: default avatarMel Gorman <mel@csn.ul.ie>
    Reviewed-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Reviewed-by: default avatarRik van Riel <riel@redhat.com>
    Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Cc: Minchan Kim <minchan.kim@gmail.com>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Reviewed-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a8bef8ff