Skip to content

Commit 698c008

Browse files
Baolin Wangakpm00
authored andcommitted
mm: convert do_set_pmd() to take a folio
In do_set_pmd(), we always use the folio->page to build PMD mappings for the entire folio. Since all callers of do_set_pmd() already hold a stable folio, converting do_set_pmd() to take a folio is safe and more straightforward. In addition, to ensure the extensibility of do_set_pmd() for supporting larger folios beyond PMD size, we keep the 'page' parameter to specify which page within the folio should be mapped. No functional changes expected. Link: https://lkml.kernel.org/r/9b488f4ecb4d3fd8634e3d448dd0ed6964482480.1747017104.git.baolin.wang@linux.alibaba.com Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> Reviewed-by: Zi Yan <ziy@nvidia.com> Acked-by: David Hildenbrand <david@redhat.com> Cc: Dev Jain <dev.jain@arm.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Liam Howlett <liam.howlett@oracle.com> Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Cc: Mariano Pache <npache@redhat.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Mike Rapoport <rppt@kernel.org> Cc: Ryan Roberts <ryan.roberts@arm.com> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 5053383 commit 698c008

4 files changed

Lines changed: 8 additions & 9 deletions

File tree

include/linux/mm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1235,7 +1235,7 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma)
12351235
return pte;
12361236
}
12371237

1238-
vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page);
1238+
vm_fault_t do_set_pmd(struct vm_fault *vmf, struct folio *folio, struct page *page);
12391239
void set_pte_range(struct vm_fault *vmf, struct folio *folio,
12401240
struct page *page, unsigned int nr, unsigned long addr);
12411241

mm/filemap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3533,7 +3533,7 @@ static bool filemap_map_pmd(struct vm_fault *vmf, struct folio *folio,
35333533

35343534
if (pmd_none(*vmf->pmd) && folio_test_pmd_mappable(folio)) {
35353535
struct page *page = folio_file_page(folio, start);
3536-
vm_fault_t ret = do_set_pmd(vmf, page);
3536+
vm_fault_t ret = do_set_pmd(vmf, folio, page);
35373537
if (!ret) {
35383538
/* The page is mapped successfully, reference consumed. */
35393539
folio_unlock(folio);

mm/khugepaged.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1478,7 +1478,7 @@ static int set_huge_pmd(struct vm_area_struct *vma, unsigned long addr,
14781478

14791479
mmap_assert_locked(vma->vm_mm);
14801480

1481-
if (do_set_pmd(&vmf, page))
1481+
if (do_set_pmd(&vmf, folio, page))
14821482
return SCAN_FAIL;
14831483

14841484
folio_get(folio);

mm/memory.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5227,9 +5227,8 @@ static void deposit_prealloc_pte(struct vm_fault *vmf)
52275227
vmf->prealloc_pte = NULL;
52285228
}
52295229

5230-
vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page)
5230+
vm_fault_t do_set_pmd(struct vm_fault *vmf, struct folio *folio, struct page *page)
52315231
{
5232-
struct folio *folio = page_folio(page);
52335232
struct vm_area_struct *vma = vmf->vma;
52345233
bool write = vmf->flags & FAULT_FLAG_WRITE;
52355234
unsigned long haddr = vmf->address & HPAGE_PMD_MASK;
@@ -5302,7 +5301,7 @@ vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page)
53025301
return ret;
53035302
}
53045303
#else
5305-
vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page)
5304+
vm_fault_t do_set_pmd(struct vm_fault *vmf, struct folio *folio, struct page *page)
53065305
{
53075306
return VM_FAULT_FALLBACK;
53085307
}
@@ -5396,6 +5395,7 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
53965395
else
53975396
page = vmf->page;
53985397

5398+
folio = page_folio(page);
53995399
/*
54005400
* check even for read faults because we might have lost our CoWed
54015401
* page
@@ -5407,8 +5407,8 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
54075407
}
54085408

54095409
if (pmd_none(*vmf->pmd)) {
5410-
if (PageTransCompound(page)) {
5411-
ret = do_set_pmd(vmf, page);
5410+
if (folio_test_pmd_mappable(folio)) {
5411+
ret = do_set_pmd(vmf, folio, page);
54125412
if (ret != VM_FAULT_FALLBACK)
54135413
return ret;
54145414
}
@@ -5419,7 +5419,6 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
54195419
return VM_FAULT_OOM;
54205420
}
54215421

5422-
folio = page_folio(page);
54235422
nr_pages = folio_nr_pages(folio);
54245423

54255424
/*

0 commit comments

Comments
 (0)