On Thu, Apr 01, 2021 at 11:17:37AM -0700, Suren Baghdasaryan wrote:
From: Kirill Tkhai ktkhai@virtuozzo.com
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@localh... Signed-off-by: Kirill Tkhai ktkhai@virtuozzo.com Reviewed-by: Yang 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: Andrew Morton akpm@linux-foundation.org Signed-off-by: Linus Torvalds torvalds@linux-foundation.org
include/linux/ksm.h | 7 +++++++ mm/ksm.c | 30 ++++++++++++++++++++++++++++-- mm/memory.c | 16 ++++++++++++++-- 3 files changed, 49 insertions(+), 4 deletions(-)
You forgot to put the git commit id of the upstream commit in here somewhere so we can properly reference it and track it.
When/if you resend this, please add it to all of the commits.
thanks,
greg k-h