| From: Kiryl Shutsemau <kas@kernel.org> |
| Subject: mm/fault: try to map the entire file folio in finish_fault() |
| Date: Tue, 23 Sep 2025 12:07:09 +0100 |
| |
| 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> |
| --- |
| |
| mm/memory.c | 9 ++------- |
| 1 file changed, 2 insertions(+), 7 deletions(-) |
| |
| --- a/mm/memory.c~mm-fault-try-to-map-the-entire-file-folio-in-finish_fault |
| +++ a/mm/memory.c |
| @@ -5516,13 +5516,8 @@ fallback: |
| |
| nr_pages = folio_nr_pages(folio); |
| |
| - /* |
| - * Using per-page fault to maintain the uffd semantics, and same |
| - * approach also applies to non shmem/tmpfs faults to avoid |
| - * inflating the RSS of the process. |
| - */ |
| - if (!vma_is_shmem(vma) || unlikely(userfaultfd_armed(vma)) || |
| - unlikely(needs_fallback)) { |
| + /* Using per-page fault to maintain the uffd semantics */ |
| + if (unlikely(userfaultfd_armed(vma)) || unlikely(needs_fallback)) { |
| nr_pages = 1; |
| } else if (nr_pages > 1) { |
| pgoff_t idx = folio_page_idx(folio, page); |
| _ |