[PATCH RFC 15/15] mm/madvise: convert to new lru refs API and better support for MGLRU
Kairui Song via B4 Relay <[email protected]> Tue, 04 Aug 2026 03:47:11 +0800
| Newsgroups | org.kernel.vger.cgroups,org.kernel.feeds.b4-sent,org.kernel.vger.linux-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
From: Kairui Song <[email protected]> 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 <[email protected]> --- mm/madvise.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index abb17760b8b5..f132dd7418f5 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -350,6 +350,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) @@ -424,10 +445,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)) @@ -533,16 +551,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.55.0