• V
    mm: munlock: fix a bug where THP tail page is encountered · c424be1c
    Vlastimil Babka 提交于
    Since commit ff6a6da6 ("mm: accelerate munlock() treatment of THP
    pages") munlock skips tail pages of a munlocked THP page.  However, when
    the head page already has PageMlocked unset, it will not skip the tail
    pages.
    
    Commit 7225522b ("mm: munlock: batch non-THP page isolation and
    munlock+putback using pagevec") has added a PageTransHuge() check which
    contains VM_BUG_ON(PageTail(page)).  Sasha Levin found this triggered
    using trinity, on the first tail page of a THP page without PageMlocked
    flag.
    
    This patch fixes the issue by skipping tail pages also in the case when
    PageMlocked flag is unset.  There is still a possibility of race with
    THP page split between clearing PageMlocked and determining how many
    pages to skip.  The race might result in former tail pages not being
    skipped, which is however no longer a bug, as during the skip the
    PageTail flags are cleared.
    
    However this race also affects correctness of NR_MLOCK accounting, which
    is to be fixed in a separate patch.
    Signed-off-by: NVlastimil Babka <vbabka@suse.cz>
    Reported-by: NSasha Levin <sasha.levin@oracle.com>
    Cc: Michel Lespinasse <walken@google.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Bob Liu <bob.liu@oracle.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    c424be1c
mlock.c 22.0 KB