• Hugh Dickins's avatar
    mm/munlock: page migration needs mlock pagevec drained · b7435507
    Hugh Dickins authored
    Page migration of a VM_LOCKED page tends to fail, because when the old
    page is unmapped, it is put on the mlock pagevec with raised refcount,
    which then fails the freeze.
    
    At first I thought this would be fixed by a local mlock_page_drain() at
    the upper rmap_walk() level - which would have nicely batched all the
    munlocks of that page; but tests show that the task can too easily move
    to another cpu, leaving pagevec residue behind which fails the migration.
    
    So try_to_migrate_one() drain the local pagevec after page_remove_rmap()
    from a VM_LOCKED vma; and do the same in try_to_unmap_one(), whose
    TTU_IGNORE_MLOCK users would want the same treatment; and do the same
    in remove_migration_pte() - not important when successfully inserting
    a new page, but necessary when hoping to retry after failure.
    
    Any new pagevec runs the risk of adding a new way of stranding, and we
    might discover other corners where mlock_page_drain() or lru_add_drain()
    would now help.
    Signed-off-by: default avatarHugh Dickins <hughd@google.com>
    Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
    b7435507
migrate.c 88 KB