Skip to content
  • Hugh Dickins's avatar
    mm: munlock use mapcount to avoid terrible overhead · 3d470fc3
    Hugh Dickins authored
    
    
    A process spent 30 minutes exiting, just munlocking the pages of a large
    anonymous area that had been alternately mprotected into page-sized vmas:
    for every single page there's an anon_vma walk through all the other
    little vmas to find the right one.
    
    A general fix to that would be a lot more complicated (use prio_tree on
    anon_vma?), but there's one very simple thing we can do to speed up the
    common case: if a page to be munlocked is mapped only once, then it is our
    vma that it is mapped into, and there's no need whatever to walk through
    all the others.
    
    Okay, there is a very remote race in munlock_vma_pages_range(), if between
    its follow_page() and lock_page(), another process were to munlock the
    same page, then page reclaim remove it from our vma, then another process
    mlock it again.  We would find it with page_mapcount 1, yet it's still
    mlocked in another process.  But never mind, that's much less likely than
    the down_read_trylock() failure which munlocking already tolerates (in
    try_to_unmap_one()): in due course page reclaim will discover and move the
    page to unevictable instead.
    
    [akpm@linux-foundation.org: add comment]
    Signed-off-by: default avatarHugh Dickins <hughd@google.com>
    Cc: Michel Lespinasse <walken@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3d470fc3