[PATCH RFC 19/32] mm/madvise: convert to new lru refs API and better support for MGLRU
From: Kairui Song via B4 Relay
Date: Fri May 01 2026 - 17:11:10 EST
From: Kairui Song <kasong@xxxxxxxxxxx>
For active/inactive LRU, madvise wants evicted folios from active LRU to
be considered for PSI too, so some special handling are added. But MGLRU
doesn't really need this, as it has a different activation logic.
Switch to new helpers and improve the support for MGLRU here.
Signed-off-by: Kairui Song <kasong@xxxxxxxxxxx>
---
mm/madvise.c | 37 +++++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 14 deletions(-)
diff --git a/mm/madvise.c b/mm/madvise.c
index 930939c55cd5..e42266a03fe9 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -351,6 +351,27 @@ static inline int madvise_folio_pte_batch(unsigned long addr, unsigned long end,
FPB_MERGE_YOUNG_DIRTY);
}
+/*
+ * We are deactivating a folio for accelerating reclaiming.
+ * VM couldn't reclaim the folio unless we clear PG_young.
+ * As a side effect, it makes confuse idle-page tracking
+ * because they will miss recent referenced history.
+ */
+static void madvise_cold_or_pageout_prep_folio(struct folio *folio)
+{
+ folio_test_clear_young(folio);
+
+ /*
+ * MGLRU clears all reference flags in folio_deactivate,
+ * no need to touch it here.
+ */
+ if (!lru_gen_enabled()) {
+ folio_clear_referenced_by_bit(folio);
+ if (folio_test_active(folio))
+ folio_mark_workingset_by_bit(folio);
+ }
+}
+
static int madvise_cold_or_pageout_pte_range(pmd_t *pmd,
unsigned long addr, unsigned long end,
struct mm_walk *walk)
@@ -425,10 +446,7 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd,
tlb_remove_pmd_tlb_entry(tlb, pmd, addr);
}
- folio_clear_referenced(folio);
- folio_test_clear_young(folio);
- if (folio_test_active(folio))
- folio_mark_workingset_by_bit(folio);
+ madvise_cold_or_pageout_prep_folio(folio);
if (pageout) {
if (folio_isolate_lru(folio)) {
if (folio_test_unevictable(folio))
@@ -534,16 +552,7 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd,
tlb_remove_tlb_entries(tlb, pte, nr, addr);
}
- /*
- * We are deactivating a folio for accelerating reclaiming.
- * VM couldn't reclaim the folio unless we clear PG_young.
- * As a side effect, it makes confuse idle-page tracking
- * because they will miss recent referenced history.
- */
- folio_clear_referenced(folio);
- folio_test_clear_young(folio);
- if (folio_test_active(folio))
- folio_mark_workingset_by_bit(folio);
+ madvise_cold_or_pageout_prep_folio(folio);
if (pageout) {
if (folio_isolate_lru(folio)) {
if (folio_test_unevictable(folio))
--
2.54.0