All of lore.kernel.org
 help / color / mirror / Atom feed
* [to-be-updated] mm-mglru-fix-using-folio_mark_accessed-to-replace-folio_set_active.patch removed from -mm tree
@ 2026-10-17 22:48 Andrew Morton
  0 siblings, 0 replies; only message in thread
From: Andrew Morton @ 2026-10-17 22:48 UTC (permalink / raw)
  To: mm-commits, yuzhao, yuanchu, weixugc, stable, shakeel.butt,
	qi.zheng, lance.yang, kasong, ehab.ababneh, baoquan.he,
	baolin.wang, axelrasmussen, baohua, akpm


The quilt patch titled
     Subject: mm/mglru: fix using folio_mark_accessed to replace folio_set_active
has been removed from the -mm tree.  Its filename was
     mm-mglru-fix-using-folio_mark_accessed-to-replace-folio_set_active.patch

This patch was dropped because an updated version will be issued

------------------------------------------------------
From: "Barry Song (Xiaomi)" <baohua@kernel.org>
Subject: mm/mglru: fix using folio_mark_accessed to replace folio_set_active
Date: Sat, 17 Oct 2026 05:31:15 +0800

Commit 6cbdd9726fb5 ("mm/mglru: use folio_mark_accessed to replace
folio_set_active") attempted to avoid over-protecting in-fault read-ahead
file folios by placing them in the second-oldest generation rather than
the young generations.

However, it repurposes `PG_referenced` on in-fault read-ahead file folios
for this purpose, potentially coupling their handling with that of regular
file accesses through syscalls, which also use `PG_referenced`.

This could regress some workloads, as reported by Kairui Song[1] and Ehab
Ababneh[2].  Many thanks to both for reporting these issues!

The long-term fix is Kairui's MGLRU-FG, but in the meantime, we also need
a quick fix that can be backported to stable.

This patch reverts the original commit's abuse of `PG_referenced` while
preserving its goal of avoiding over-protection of in-fault read-ahead
file folios by adjusting only `lru_gen_folio_seq()`.

Specifically, in-fault read-ahead file folios with `PG_active` set but
`PG_workingset` clear are placed in the second-oldest generation (the
third-youngest generation).  Activated file folios and refaulted
workingset file folios remain in the youngest generations.

Kernel build tests in a memcg show that this approach not only preserves
the original patch's benefits but also further improves performance.

w/o fix:

real    1m49.094s
user    25m31.484s
sys     3m40.959s
pswpin: 662112
pswpout: 2504415
pgpgin: 4424336
pgpgout: 10355273
refault_file: 359626
refault_anon: 670724

w/ fix:

real    1m48.913s
user    25m31.639s
sys     3m30.875s
pswpin: 689815
pswpout: 2689894
pgpgin: 4422659
pgpgout: 11043464
refault_file: 326566
refault_anon: 697138

Revert original patch:

real    1m50.044s
user    25m37.137s
sys     4m4.493s
pswpin: 1349087
pswpout: 4317933
pgpgin: 7083597
pgpgout: 17602735
refault_file: 337676
refault_anon: 1368542

Link: https://lore.kernel.org/20261016213115.70515-1-baohua@kernel.org
Link: https://lore.kernel.org/linux-mm/20261003-mglru-fg-v3-0-cbd4546a5bd9@tencent.com/ [1]
Link: https://lore.kernel.org/linux-mm/20260901180704.168106-1-ehab.ababneh@intel.com/ [2]
Fixes: 6cbdd9726fb5 ("mm/mglru: use folio_mark_accessed to replace folio_set_active")
Signed-off-by: Barry Song (Xiaomi) <baohua@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Ehab Ababneh <ehab.ababneh@intel.com>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Kairui Song <kasong@tencent.com>
Cc: Lance Yang <lance.yang@linux.dev>
Cc: Qi Zheng <qi.zheng@linux.dev>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Wei Xu <weixugc@google.com>
Cc: Yuanchu Xie <yuanchu@google.com>
Cc: Yu Zhao <yuzhao@google.com>
Cc: Baoquan He <baoquan.he@linux.dev>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: <stable@vger.kernel.org>
---

 include/linux/mm_inline.h |    5 +++--
 mm/folio.c                |   16 +++-------------
 mm/vmscan.c               |    9 ++-------
 mm/workingset.c           |   10 ++++------
 4 files changed, 12 insertions(+), 28 deletions(-)

--- a/include/linux/mm_inline.h~mm-mglru-fix-using-folio_mark_accessed-to-replace-folio_set_active
+++ a/include/linux/mm_inline.h
@@ -319,7 +319,8 @@ static inline unsigned long lru_gen_foli
 	 * |<---------------------------- MAX_NR_GENS ---------------------------->|
 	 */
 	if (folio_test_active(folio))
-		gen = MIN_NR_GENS - folio_test_workingset(folio);
+		gen = MIN_NR_GENS - folio_test_workingset(folio) +
+		      (type ? !folio_test_workingset(folio) : 0);
 	else if (reclaiming)
 		gen = MAX_NR_GENS;
 	else if ((!folio_is_file_lru(folio) && !folio_test_swapcache(folio)) ||
@@ -327,7 +328,7 @@ static inline unsigned long lru_gen_foli
 		  (folio_test_dirty(folio) || folio_test_writeback(folio))))
 		gen = MIN_NR_GENS;
 	else
-		gen = MAX_NR_GENS - (folio_test_workingset(folio) || folio_test_referenced(folio));
+		gen = MAX_NR_GENS - folio_test_workingset(folio);
 
 	return max(READ_ONCE(lrugen->max_seq) - gen + 1, READ_ONCE(lrugen->min_seq[type]));
 }
--- a/mm/folio.c~mm-mglru-fix-using-folio_mark_accessed-to-replace-folio_set_active
+++ a/mm/folio.c
@@ -474,20 +474,10 @@ void folio_add_lru(struct folio *folio)
 			folio_test_unevictable(folio), folio);
 	VM_BUG_ON_FOLIO(folio_test_lru(folio), folio);
 
-	/*
-	 * For refaulted workingset folios, set PG_active so they
-	 * can be added to active generations.
-	 * For prefaulted file folios, folio_mark_accessed() sets
-	 * PG_referenced so lru_gen_folio_seq() places them into
-	 * the second oldest generation.
-	 */
+	/* see the comment in lru_gen_folio_seq() */
 	if (lru_gen_enabled() && !folio_test_unevictable(folio) &&
-	    lru_gen_in_fault() && !(current->flags & PF_MEMALLOC)) {
-		if (folio_test_workingset(folio))
-			folio_set_active(folio);
-		else if (!folio_test_referenced(folio))
-			folio_mark_accessed(folio);
-	}
+	    lru_gen_in_fault() && !(current->flags & PF_MEMALLOC))
+		folio_set_active(folio);
 
 	folio_batch_add_and_move(folio, lru_add);
 }
--- a/mm/vmscan.c~mm-mglru-fix-using-folio_mark_accessed-to-replace-folio_set_active
+++ a/mm/vmscan.c
@@ -952,13 +952,8 @@ static bool lru_gen_set_refs(struct foli
 		return false;
 	}
 
-	/* Promote on second access */
-	if (folio_lru_refs(folio) > 1) {
-		folio_set_workingset(folio);
-		folio_set_lru_refs(folio, 0);
-	} else {
-		folio_mark_accessed(folio);
-	}
+	folio_set_workingset(folio);
+	folio_set_lru_refs(folio, 0);
 	return true;
 }
 #else
--- a/mm/workingset.c~mm-mglru-fix-using-folio_mark_accessed-to-replace-folio_set_active
+++ a/mm/workingset.c
@@ -319,13 +319,11 @@ static void lru_gen_refault(struct folio
 
 	atomic_long_add(delta, &lrugen->refaulted[hist][type][tier]);
 
+	/* see folio_add_lru() where folio_set_active() will be called */
+	if (lru_gen_in_fault())
+		mod_lruvec_state(lruvec, WORKINGSET_ACTIVATE_BASE + type, delta);
+
 	if (workingset) {
-		/*
-		 * see folio_add_lru(), where folio_set_active() is
-		 * called for workingset folios
-		 */
-		if (lru_gen_in_fault())
-			mod_lruvec_state(lruvec, WORKINGSET_ACTIVATE_BASE + type, delta);
 		folio_set_workingset(folio);
 		mod_lruvec_state(lruvec, WORKINGSET_RESTORE_BASE + type, delta);
 	} else
_

Patches currently in -mm which might be from baohua@kernel.org are



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-10-17 22:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-17 22:48 [to-be-updated] mm-mglru-fix-using-folio_mark_accessed-to-replace-folio_set_active.patch removed from -mm tree Andrew Morton

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.