Re: [RFC PATCH] mm: don't promote exclusive file folios of dying processes

From: Baolin Wang
Date: Wed Apr 16 2025 - 04:28:44 EST




On 2025/4/16 15:48, Barry Song wrote:
On Sun, Apr 13, 2025 at 12:31 AM Zi Yan <ziy@xxxxxxxxxx> wrote:

On 12 Apr 2025, at 4:58, Barry Song wrote:

From: Barry Song <v-songbaohua@xxxxxxxx>

Promoting exclusive file folios of a dying process is unnecessary and
harmful. For example, while Firefox is killed and LibreOffice is
launched, activating Firefox's young file-backed folios makes it
harder to reclaim memory that LibreOffice doesn't use at all.

An exiting process is unlikely to be restarted right away—it's
either terminated by the user or killed by the OOM handler.

The proposal looks reasonable to me. Do you have any performance number
about the improvement?

Tangquan ran the test on Android phones and saw 3% improvement on
refault/thrashing things:

Good.

w/o patch w/patch
workingset_refault_anon 2215933 2146602 3.13%
workingset_refault_file 9859208 9646518 2.16%
pswpin 2411086 2337790 3.04%
pswpout 6482838 6264865 3.36%

A further demotion of exclusive file folios can improvement more, but
might be controversial. it could be a separate patch later.



Cc: Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx>
Cc: David Hildenbrand <david@xxxxxxxxxx>
Cc: Johannes Weiner <hannes@xxxxxxxxxxx>
Cc: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx>
Cc: Oscar Salvador <osalvador@xxxxxxx>
Cc: Ryan Roberts <ryan.roberts@xxxxxxx>
Cc: Zi Yan <ziy@xxxxxxxxxx>
Signed-off-by: Barry Song <v-songbaohua@xxxxxxxx>
---
mm/huge_memory.c | 4 ++--
mm/internal.h | 19 +++++++++++++++++++
mm/memory.c | 9 ++++++++-
3 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index e97a97586478..05b83d2fcbb6 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2264,8 +2264,8 @@ int zap_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
* Use flush_needed to indicate whether the PMD entry
* is present, instead of checking pmd_present() again.
*/
- if (flush_needed && pmd_young(orig_pmd) &&
- likely(vma_has_recency(vma)))
+ if (!exclusive_folio_of_dying_process(folio, vma) && flush_needed &&

Nit: I prefer to check 'flush_needed' first to make sure it is a present pte. Otherwise look good to me.

+ pmd_young(orig_pmd) && likely(vma_has_recency(vma)))
folio_mark_accessed(folio);
}

diff --git a/mm/internal.h b/mm/internal.h
index 4e0ea83aaf1c..666de96a293d 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -11,6 +11,7 @@
#include <linux/khugepaged.h>
#include <linux/mm.h>
#include <linux/mm_inline.h>
+#include <linux/oom.h>
#include <linux/pagemap.h>
#include <linux/pagewalk.h>
#include <linux/rmap.h>
@@ -130,6 +131,24 @@ static inline int folio_nr_pages_mapped(const struct folio *folio)
return atomic_read(&folio->_nr_pages_mapped) & FOLIO_PAGES_MAPPED;
}

+/*
+ * Return true if a folio is exclusive and belongs to an exiting or
+ * oom-reaped process; otherwise, return false.
+ */
+static inline bool exclusive_folio_of_dying_process(struct folio *folio,
+ struct vm_area_struct *vma)
+{
+ if (folio_maybe_mapped_shared(folio))
+ return false;
+
+ if (!atomic_read(&vma->vm_mm->mm_users))
+ return true;
+ if (check_stable_address_space(vma->vm_mm))
+ return true;
+
+ return false;
+}
+
/*
* Retrieve the first entry of a folio based on a provided entry within the
* folio. We cannot rely on folio->swap as there is no guarantee that it has
diff --git a/mm/memory.c b/mm/memory.c
index b9e8443aaa86..cab69275e473 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1515,7 +1515,14 @@ static __always_inline void zap_present_folio_ptes(struct mmu_gather *tlb,
*force_flush = true;
}
}
- if (pte_young(ptent) && likely(vma_has_recency(vma)))
+
+ /*
+ * Skip marking exclusive file folios as accessed for processes that are
+ * exiting or have been reaped due to OOM. This prevents unnecessary
+ * promotion of folios that won't benefit the new process being launched.
+ */
+ if (!exclusive_folio_of_dying_process(folio, vma) && pte_young(ptent) &&
+ likely(vma_has_recency(vma)))
folio_mark_accessed(folio);
rss[mm_counter(folio)] -= nr;
} else {
--
2.39.3 (Apple Git-146)


--
Best Regards,
Yan, Zi

Thanks
Barry