Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm/filemap: map entire large folio faultaround

Currently, kernel only maps part of large folio that fits into
start_pgoff/end_pgoff range.

Map entire folio where possible. It will match finish_fault() behaviour
that user hits on cold page cache.

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-6-kirill@shutemov.name
Signed-off-by: Kiryl Shutsemau <kas@kernel.org>
Cc: 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>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Kiryl Shutsemau and committed by
Andrew Morton
357b9276 19773df0

+15
+15
mm/filemap.c
··· 3670 3670 struct page *page = folio_page(folio, start); 3671 3671 unsigned int count = 0; 3672 3672 pte_t *old_ptep = vmf->pte; 3673 + unsigned long addr0; 3674 + 3675 + /* 3676 + * Map the large folio fully where possible. 3677 + * 3678 + * The folio must not cross VMA or page table boundary. 3679 + */ 3680 + addr0 = addr - start * PAGE_SIZE; 3681 + if (folio_within_vma(folio, vmf->vma) && 3682 + (addr0 & PMD_MASK) == ((addr0 + folio_size(folio) - 1) & PMD_MASK)) { 3683 + vmf->pte -= start; 3684 + page -= start; 3685 + addr = addr0; 3686 + nr_pages = folio_nr_pages(folio); 3687 + } 3673 3688 3674 3689 do { 3675 3690 if (PageHWPoison(page + count))