• A
    mm: thp: make the THP mapcount atomic against __split_huge_pmd_locked() · c444eb56
    Andrea Arcangeli 提交于
    Write protect anon page faults require an accurate mapcount to decide
    if to break the COW or not. This is implemented in the THP path with
    reuse_swap_page() ->
    page_trans_huge_map_swapcount()/page_trans_huge_mapcount().
    
    If the COW triggers while the other processes sharing the page are
    under a huge pmd split, to do an accurate reading, we must ensure the
    mapcount isn't computed while it's being transferred from the head
    page to the tail pages.
    
    reuse_swap_cache() already runs serialized by the page lock, so it's
    enough to add the page lock around __split_huge_pmd_locked too, in
    order to add the missing serialization.
    
    Note: the commit in "Fixes" is just to facilitate the backporting,
    because the code before such commit didn't try to do an accurate THP
    mapcount calculation and it instead used the page_count() to decide if
    to COW or not. Both the page_count and the pin_count are THP-wide
    refcounts, so they're inaccurate if used in
    reuse_swap_page(). Reverting such commit (besides the unrelated fix to
    the local anon_vma assignment) would have also opened the window for
    memory corruption side effects to certain workloads as documented in
    such commit header.
    Signed-off-by: NAndrea Arcangeli <aarcange@redhat.com>
    Suggested-by: NJann Horn <jannh@google.com>
    Reported-by: NJann Horn <jannh@google.com>
    Acked-by: NKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Fixes: 6d0a07ed ("mm: thp: calculate the mapcount correctly for THP pages during WP faults")
    Cc: stable@vger.kernel.org
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    c444eb56
huge_memory.c 87.8 KB