Skip to content

Commit ab521b4

Browse files
Kiryl Shutsemauakpm00
authored andcommitted
mm/rmap: improve mlock tracking for large folios
The kernel currently does not mlock large folios when adding them to rmap, stating that it is difficult to confirm that the folio is fully mapped and safe to mlock it. This leads to a significant undercount of Mlocked in /proc/meminfo, causing problems in production where the stat was used to estimate system utilization and determine if load shedding is required. However, nowadays the caller passes a number of pages of the folio that are getting mapped, making it easy to check if the entire folio is mapped to the VMA. mlock the folio on rmap if it is fully mapped to the VMA. Mlocked in /proc/meminfo can still undercount, but the value is closer the truth and is useful for userspace. Link: https://lkml.kernel.org/r/20250923110711.690639-7-kirill@shutemov.name Signed-off-by: Kiryl Shutsemau <kas@kernel.org> Acked-by: David Hildenbrand <david@redhat.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Shakeel Butt <shakeel.butt@linux.dev> Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 357b927 commit ab521b4

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

mm/rmap.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,12 +1463,12 @@ static __always_inline void __folio_add_anon_rmap(struct folio *folio,
14631463
}
14641464

14651465
/*
1466-
* For large folio, only mlock it if it's fully mapped to VMA. It's
1467-
* not easy to check whether the large folio is fully mapped to VMA
1468-
* here. Only mlock normal 4K folio and leave page reclaim to handle
1469-
* large folio.
1466+
* Only mlock it if the folio is fully mapped to the VMA.
1467+
*
1468+
* Partially mapped folios can be split on reclaim and part outside
1469+
* of mlocked VMA can be evicted or freed.
14701470
*/
1471-
if (!folio_test_large(folio))
1471+
if (folio_nr_pages(folio) == nr_pages)
14721472
mlock_vma_folio(folio, vma);
14731473
}
14741474

@@ -1601,8 +1601,13 @@ static __always_inline void __folio_add_file_rmap(struct folio *folio,
16011601

16021602
__folio_add_rmap(folio, page, nr_pages, vma, level);
16031603

1604-
/* See comments in folio_add_anon_rmap_*() */
1605-
if (!folio_test_large(folio))
1604+
/*
1605+
* Only mlock it if the folio is fully mapped to the VMA.
1606+
*
1607+
* Partially mapped folios can be split on reclaim and part outside
1608+
* of mlocked VMA can be evicted or freed.
1609+
*/
1610+
if (folio_nr_pages(folio) == nr_pages)
16061611
mlock_vma_folio(folio, vma);
16071612
}
16081613

0 commit comments

Comments
 (0)