[PATCH RFC v2 14/15] mm/khugepaged: check folio referenced state via LRU refs under MGLRU

From: Kairui Song via B4 Relay

Date: Fri Sep 11 2026 - 08:03:51 EST


From: Kairui Song <kasong@xxxxxxxxxxx>

For MGLRU, PG_referenced is only the lowest bit of the folio LRU refs
count, so folios with a higher refs count no longer have the bit set.
folio_pte_referenced() testing the raw bit misses hot folios at
refs >= 2, under-counting the referenced folios of a candidate range
and aborting otherwise good collapses with SCAN_LACK_REFERENCED_PAGE.

Test the refs count directly when MGLRU is enabled, mirroring the
smaps conversion. The classical LRU keeps the plain bit test.

Signed-off-by: Kairui Song <kasong@xxxxxxxxxxx>
---
mm/khugepaged.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index 1deb74cf28af..a3ce6735bc32 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -597,7 +597,9 @@ static bool folio_pte_referenced(struct folio *folio,
struct vm_area_struct *vma, unsigned long addr, pte_t pteval)
{
/* The folio was referenced previously ... */
- if (folio_test_young(folio) || folio_test_referenced(folio))
+ if (folio_test_young(folio))
+ return true;
+ if (lru_gen_enabled() ? folio_lru_refs(folio) : folio_test_referenced(folio))
return true;
/* ... or the PTE mapping was recently used */
return pte_young(pteval) || mmu_notifier_test_young(vma->vm_mm, addr);

--
2.55.0