[PATCH] psi: Treat ksm swapping in copy as memstall

From: cgel . zte
Date: Sun Jan 16 2022 - 10:22:30 EST


From: Yang Yang <yang.yang29@xxxxxxxxxx>

When faults in from swap what used to be a ksm page and that page
had been swapped in before, system has to make a copy. Obviously
this kind of copy is related to high memory pressure, so we treat
it as memstall. Although ksm page merging is not because of high
memory pressure.

Information of this new kind of stall will help psi to account
memory pressure more precise.

Signed-off-by: Yang Yang <yang.yang29@xxxxxxxxxx>
---
mm/ksm.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/mm/ksm.c b/mm/ksm.c
index 4a7f8614e57d..d4ec6773f9b8 100644
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -39,6 +39,7 @@
#include <linux/freezer.h>
#include <linux/oom.h>
#include <linux/numa.h>
+#include <linux/psi.h>

#include <asm/tlbflush.h>
#include "internal.h"
@@ -2569,6 +2570,7 @@ struct page *ksm_might_need_to_copy(struct page *page,
{
struct anon_vma *anon_vma = page_anon_vma(page);
struct page *new_page;
+ unsigned long pflags;

if (PageKsm(page)) {
if (page_stable_node(page) &&
@@ -2583,6 +2585,7 @@ struct page *ksm_might_need_to_copy(struct page *page,
if (!PageUptodate(page))
return page; /* let do_swap_page report the error */

+ psi_memstall_enter(&pflags);
new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, address);
if (new_page &&
mem_cgroup_charge(page_folio(new_page), vma->vm_mm, GFP_KERNEL)) {
@@ -2600,6 +2603,7 @@ struct page *ksm_might_need_to_copy(struct page *page,
#endif
}

+ psi_memstall_leave(&pflags);
return new_page;
}

--
2.25.1