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) > --- > 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