If an anon folio reclaimed by shrink_inactive_list is mapped by an exiting task, this anon folio will be firstly swaped-out into swapspace in shrink flow and then this swap folio is freed in task exit flow. But if this folio mapped by an exiting task can skip shrink and be freed directly in task exiting flow, which will save swap-out time and alleviate the load of the tasks exiting process. The file folio is also similar. And when system is low memory, it more likely to occur, because more backend applidatuions will be killed. This patch can alleviate the cpu load of the tasks exiting process. Signed-off-by: Qianfeng Rong <rongqianfeng@xxxxxxxxxxxxxxxxxxxxxxxxxxxx> --- Change log: v3->v4: 1.Modify that the unshared folios mapped only in exiting task are skip. v2->v3: Nothing. v1->v2: 1.The VM_EXITING added in v1 patch is removed, because it will fail to compile in 32-bit system. Signed-off-by: Zhiguo Jiang <justinjiang@xxxxxxxx> --- mm/rmap.c | 10 ++++++++++ 1 file changed, 10 insertions(+) mode change 100644 => 100755 mm/rmap.c diff --git a/mm/rmap.c b/mm/rmap.c index 26806b49a86f..16b7ed04bcbe --- a/mm/rmap.c +++ b/mm/rmap.c @@ -843,6 +843,16 @@ static bool folio_referenced_one(struct folio *folio, int referenced = 0; unsigned long start = address, ptes = 0; + /* Skip the unshared folios mapped only by the single + * exiting process. + */ + if ((!atomic_read(&vma->vm_mm->mm_users) || + test_bit(MMF_OOM_SKIP, &vma->vm_mm->flags)) && + !test_bit(VM_SHARED, &vma->vm_flags)) { + pra->referenced = -1; + return false; + } + while (page_vma_mapped_walk(&pvmw)) { address = pvmw.address; -- 2.39.0