Skip to content

Commit 19773df

Browse files
Kiryl Shutsemauakpm00
authored andcommitted
mm/fault: try to map the entire file folio in finish_fault()
finish_fault() uses per-page fault for file folios. This only occurs for file folios smaller than PMD_SIZE. The comment suggests that this approach prevents RSS inflation. However, it only prevents RSS accounting. The folio is still mapped to the process, and the fact that it is mapped by a single PTE does not affect memory pressure. Additionally, the kernel's ability to map large folios as PMD if they are large enough does not support this argument. When possible, map large folios in one shot. This reduces the number of minor page faults and allows for TLB coalescing. Mapping large folios at once will allow the rmap code to mlock it on add, as it will recognize that it is fully mapped and mlocking is safe. Link: https://lkml.kernel.org/r/20250923110711.690639-5-kirill@shutemov.name Signed-off-by: Kiryl Shutsemau <kas@kernel.org> Reviewed-by: Shakeel Butt <shakeel.butt@linux.dev> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> Cc: David Hildenbrand <david@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 8c49fba commit 19773df

File tree

1 file changed

+2
-7
lines changed

1 file changed

+2
-7
lines changed

mm/memory.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5516,13 +5516,8 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
55165516

55175517
nr_pages = folio_nr_pages(folio);
55185518

5519-
/*
5520-
* Using per-page fault to maintain the uffd semantics, and same
5521-
* approach also applies to non shmem/tmpfs faults to avoid
5522-
* inflating the RSS of the process.
5523-
*/
5524-
if (!vma_is_shmem(vma) || unlikely(userfaultfd_armed(vma)) ||
5525-
unlikely(needs_fallback)) {
5519+
/* Using per-page fault to maintain the uffd semantics */
5520+
if (unlikely(userfaultfd_armed(vma)) || unlikely(needs_fallback)) {
55265521
nr_pages = 1;
55275522
} else if (nr_pages > 1) {
55285523
pgoff_t idx = folio_page_idx(folio, page);

0 commit comments

Comments
 (0)