• Linus Torvalds's avatar
    vm: fix mlock() on stack guard page · 95042f9e
    Linus Torvalds authored
    Commit 53a7706d ("mlock: do not hold mmap_sem for extended periods
    of time") changed mlock() to care about the exact number of pages that
    __get_user_pages() had brought it.  Before, it would only care about
    errors.
    
    And that doesn't work, because we also handled one page specially in
    __mlock_vma_pages_range(), namely the stack guard page.  So when that
    case was handled, the number of pages that the function returned was off
    by one.  In particular, it could be zero, and then the caller would end
    up not making any progress at all.
    
    Rather than try to fix up that off-by-one error for the mlock case
    specially, this just moves the logic to handle the stack guard page
    into__get_user_pages() itself, thus making all the counts come out
    right automatically.
    Reported-by: default avatarRobert Święcki <robert@swiecki.net>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: stable@kernel.org
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    95042f9e
mlock.c 15.5 KB