• Huang Ying's avatar
    mm, swap: fix swapoff with KSM pages · 89b03877
    Huang Ying authored
    commit 7af7a8e1 upstream.
    
    KSM pages may be mapped to the multiple VMAs that cannot be reached from
    one anon_vma.  So during swapin, a new copy of the page need to be
    generated if a different anon_vma is needed, please refer to comments of
    ksm_might_need_to_copy() for details.
    
    During swapoff, unuse_vma() uses anon_vma (if available) to locate VMA and
    virtual address mapped to the page, so not all mappings to a swapped out
    KSM page could be found.  So in try_to_unuse(), even if the swap count of
    a swap entry isn't zero, the page needs to be deleted from swap cache, so
    that, in the next round a new page could be allocated and swapin for the
    other mappings of the swapped out KSM page.
    
    But this contradicts with the THP swap support.  Where the THP could be
    deleted from swap cache only after the swap count of every swap entry in
    the huge swap cluster backing the THP has reach 0.  So try_to_unuse() is
    changed in commit e0709829 ("mm, THP, swap: support to reclaim swap
    space for THP swapped out") to check that before delete a page from swap
    cache, but this has broken KSM swapoff too.
    
    Fortunately, KSM is for the normal pages only, so the original behavior
    for KSM pages could be restored easily via checking PageTransCompound().
    That is how this patch works.
    
    The bug is introduced by e0709829 ("mm, THP, swap: support to reclaim
    swap space for THP swapped out"), which is merged by v4.14-rc1.  So I
    think we should backport the fix to from 4.14 on.  But Hugh thinks it may
    be rare for the KSM pages being in the swap device when swapoff, so nobody
    reports the bug so far.
    
    Link: http://lkml.kernel.org/r/20181226051522.28442-1-ying.huang@intel.com
    Fixes: e0709829 ("mm, THP, swap: support to reclaim swap space for THP swapped out")
    Signed-off-by: default avatar"Huang, Ying" <ying.huang@intel.com>
    Reported-by: default avatarHugh Dickins <hughd@google.com>
    Tested-by: default avatarHugh Dickins <hughd@google.com>
    Acked-by: default avatarHugh Dickins <hughd@google.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Shaohua Li <shli@kernel.org>
    Cc: Daniel Jordan <daniel.m.jordan@oracle.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    89b03877
swapfile.c 94.8 KB