• Kirill Tkhai's avatar
    mm: reuse only-pte-mapped KSM page in do_wp_page() · 52d1e606
    Kirill Tkhai authored
    Add an optimization for KSM pages almost in the same way that we have
    for ordinary anonymous pages.  If there is a write fault in a page,
    which is mapped to an only pte, and it is not related to swap cache; the
    page may be reused without copying its content.
    
    [ Note that we do not consider PageSwapCache() pages at least for now,
      since we don't want to complicate __get_ksm_page(), which has nice
      optimization based on this (for the migration case). Currenly it is
      spinning on PageSwapCache() pages, waiting for when they have
      unfreezed counters (i.e., for the migration finish). But we don't want
      to make it also spinning on swap cache pages, which we try to reuse,
      since there is not a very high probability to reuse them. So, for now
      we do not consider PageSwapCache() pages at all. ]
    
    So in reuse_ksm_page() we check for 1) PageSwapCache() and 2)
    page_stable_node(), to skip a page, which KSM is currently trying to
    link to stable tree.  Then we do page_ref_freeze() to prohibit KSM to
    merge one more page into the page, we are reusing.  After that, nobody
    can refer to the reusing page: KSM skips !PageSwapCache() pages with
    zero refcount; and the protection against of all other participants is
    the same as for reused ordinary anon pages pte lock, page lock and
    mmap_sem.
    
    [akpm@linux-foundation.org: replace BUG_ON()s with WARN_ON()s]
    Link: http://lkml.kernel.org/r/154471491016.31352.1168978849911555609.stgit@localhost.localdomainSigned-off-by: default avatarKirill Tkhai <ktkhai@virtuozzo.com>
    Reviewed-by: default avatarYang Shi <yang.shi@linux.alibaba.com>
    Cc: "Kirill A. Shutemov" <kirill@shutemov.name>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Christian Koenig <christian.koenig@amd.com>
    Cc: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
    Cc: Rik van Riel <riel@surriel.com>
    Cc: Huang Ying <ying.huang@intel.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Kirill Tkhai <ktkhai@virtuozzo.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    52d1e606
memory.c 124 KB