On 01/03/23 13:13, Sidhartha Kumar wrote: > Change alloc_huge_page_nodemask() to alloc_hugetlb_folio_nodemask() and > alloc_migrate_huge_page() to alloc_migrate_hugetlb_folio(). Both functions > now return a folio rather than a page. > /* mempolicy aware migration callback */ > @@ -2357,16 +2357,16 @@ struct page *alloc_huge_page_vma(struct hstate *h, struct vm_area_struct *vma, > { > struct mempolicy *mpol; > nodemask_t *nodemask; > - struct page *page; > + struct folio *folio; > gfp_t gfp_mask; > int node; > > gfp_mask = htlb_alloc_mask(h); > node = huge_node(vma, address, gfp_mask, &mpol, &nodemask); > - page = alloc_huge_page_nodemask(h, node, nodemask, gfp_mask); > + folio = alloc_hugetlb_folio_nodemask(h, node, nodemask, gfp_mask); > mpol_cond_put(mpol); > > - return page; > + return &folio->page; Is it possible that folio could be NULL here and cause addressing exception? > diff --git a/mm/migrate.c b/mm/migrate.c > index 6932b3d5a9dd..fab706b78be1 100644 > --- a/mm/migrate.c > +++ b/mm/migrate.c > @@ -1622,6 +1622,7 @@ struct page *alloc_migration_target(struct page *page, unsigned long private) > struct migration_target_control *mtc; > gfp_t gfp_mask; > unsigned int order = 0; > + struct folio *hugetlb_folio = NULL; > struct folio *new_folio = NULL; > int nid; > int zidx; > @@ -1636,7 +1637,9 @@ struct page *alloc_migration_target(struct page *page, unsigned long private) > struct hstate *h = folio_hstate(folio); > > gfp_mask = htlb_modify_alloc_mask(h, gfp_mask); > - return alloc_huge_page_nodemask(h, nid, mtc->nmask, gfp_mask); > + hugetlb_folio = alloc_hugetlb_folio_nodemask(h, nid, > + mtc->nmask, gfp_mask); > + return &hugetlb_folio->page; and, here as well? -- Mike Kravetz > } > > if (folio_test_large(folio)) { > -- > 2.39.0 >