Message ID | 20220404193006.1429250-5-willy@infradead.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Alternative fixes for migration | expand |
On 4 Apr 2022, at 15:30, Matthew Wilcox (Oracle) wrote: > Simplify new_page() by unifying the THP and base page cases, and > handle orders other than 0 and HPAGE_PMD_ORDER correctly. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> > --- > mm/mempolicy.c | 25 +++++++++++-------------- > 1 file changed, 11 insertions(+), 14 deletions(-) > > diff --git a/mm/mempolicy.c b/mm/mempolicy.c > index ec15f4f4b714..d6d7a95b0cce 100644 > --- a/mm/mempolicy.c > +++ b/mm/mempolicy.c > @@ -1191,8 +1191,10 @@ int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from, > */ > static struct page *new_page(struct page *page, unsigned long start) > { > + struct folio *dst, *src = page_folio(page); > struct vm_area_struct *vma; > unsigned long address; > + gfp_t gfp = GFP_HIGHUSER_MOVABLE | __GFP_RETRY_MAYFAIL; > > vma = find_vma(current->mm, start); > while (vma) { > @@ -1202,24 +1204,19 @@ static struct page *new_page(struct page *page, unsigned long start) > vma = vma->vm_next; > } > > - if (PageHuge(page)) { > - return alloc_huge_page_vma(page_hstate(compound_head(page)), > + if (folio_test_hugetlb(src)) { > + return alloc_huge_page_vma(page_hstate(&src->page), > vma, address); > - } else if (PageTransHuge(page)) { > - struct page *thp; > - > - thp = alloc_hugepage_vma(GFP_TRANSHUGE, vma, address, > - HPAGE_PMD_ORDER); > - if (!thp) > - return NULL; > - prep_transhuge_page(thp); > - return thp; > + } else if (folio_test_large(src)) { > + gfp = GFP_TRANSHUGE; > } Nit. The two bracket pairs from the two ifs can be removed. > + > /* > - * if !vma, alloc_page_vma() will use task or system default policy > + * if !vma, vma_alloc_folio() will use task or system default policy > */ > - return alloc_page_vma(GFP_HIGHUSER_MOVABLE | __GFP_RETRY_MAYFAIL, > - vma, address); > + dst = vma_alloc_folio(gfp, folio_order(src), vma, address, > + folio_test_large(src)); > + return &dst->page; > } > #else > > -- > 2.34.1 -- Best Regards, Yan, Zi
On Mon, Apr 04, 2022 at 03:51:30PM -0400, Zi Yan wrote: > On 4 Apr 2022, at 15:30, Matthew Wilcox (Oracle) wrote: > > > > - if (PageHuge(page)) { > > - return alloc_huge_page_vma(page_hstate(compound_head(page)), > > + if (folio_test_hugetlb(src)) { > > + return alloc_huge_page_vma(page_hstate(&src->page), > > vma, address); > > - } else if (PageTransHuge(page)) { > > - struct page *thp; > > - > > - thp = alloc_hugepage_vma(GFP_TRANSHUGE, vma, address, > > - HPAGE_PMD_ORDER); > > - if (!thp) > > - return NULL; > > - prep_transhuge_page(thp); > > - return thp; > > + } else if (folio_test_large(src)) { > > + gfp = GFP_TRANSHUGE; > > } > > Nit. The two bracket pairs from the two ifs can be removed. Even better, the first is a return, so it can simply be: if (folio_test_hugetlb(src)) return alloc_huge_page_vma(page_hstate(&src->page), vma, address); if (folio_test_large(src)) gfp = GFP_TRANSHUGE; dst = vma_alloc_folio(gfp, folio_order(src), vma, address, folio_test_large(src));
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index ec15f4f4b714..d6d7a95b0cce 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1191,8 +1191,10 @@ int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from, */ static struct page *new_page(struct page *page, unsigned long start) { + struct folio *dst, *src = page_folio(page); struct vm_area_struct *vma; unsigned long address; + gfp_t gfp = GFP_HIGHUSER_MOVABLE | __GFP_RETRY_MAYFAIL; vma = find_vma(current->mm, start); while (vma) { @@ -1202,24 +1204,19 @@ static struct page *new_page(struct page *page, unsigned long start) vma = vma->vm_next; } - if (PageHuge(page)) { - return alloc_huge_page_vma(page_hstate(compound_head(page)), + if (folio_test_hugetlb(src)) { + return alloc_huge_page_vma(page_hstate(&src->page), vma, address); - } else if (PageTransHuge(page)) { - struct page *thp; - - thp = alloc_hugepage_vma(GFP_TRANSHUGE, vma, address, - HPAGE_PMD_ORDER); - if (!thp) - return NULL; - prep_transhuge_page(thp); - return thp; + } else if (folio_test_large(src)) { + gfp = GFP_TRANSHUGE; } + /* - * if !vma, alloc_page_vma() will use task or system default policy + * if !vma, vma_alloc_folio() will use task or system default policy */ - return alloc_page_vma(GFP_HIGHUSER_MOVABLE | __GFP_RETRY_MAYFAIL, - vma, address); + dst = vma_alloc_folio(gfp, folio_order(src), vma, address, + folio_test_large(src)); + return &dst->page; } #else
Simplify new_page() by unifying the THP and base page cases, and handle orders other than 0 and HPAGE_PMD_ORDER correctly. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- mm/mempolicy.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-)