> Acked-by: Michal Hocko <mhocko@xxxxxxxx> > Acked-by: Vlastimil Babka <vbabka@xxxxxxx> > Signed-off-by: Qian Cai <cai@xxxxxx> Reviewed-by: Oscar Salvador <osalvador@xxxxxxx> > --- > > v4: Use is_migrate_cma_page() and update the commit log per > Vlastimil. > v3: Use a string pointer instead of an array per Michal. > v2: Borrow some commit log texts. > Call dump_page() in the error path. > > mm/page_alloc.c | 30 ++++++++++++++++++------------ > 1 file changed, 18 insertions(+), 12 deletions(-) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index d96ca5bc555b..c6ce20aaf80b 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -8005,7 +8005,10 @@ void *__init alloc_large_system_hash(const > char *tablename, > bool has_unmovable_pages(struct zone *zone, struct page *page, int > count, > int migratetype, int flags) > { > - unsigned long pfn, iter, found; > + unsigned long found; > + unsigned long iter = 0; > + unsigned long pfn = page_to_pfn(page); > + const char *reason = "unmovable page"; > > /* > * TODO we could make this much more efficient by not > checking every > @@ -8015,17 +8018,20 @@ bool has_unmovable_pages(struct zone *zone, > struct page *page, int count, > * can still lead to having bootmem allocations in > zone_movable. > */ > > - /* > - * CMA allocations (alloc_contig_range) really need to mark > isolate > - * CMA pageblocks even when they are not movable in fact so > consider > - * them movable here. > - */ > - if (is_migrate_cma(migratetype) && > - is_migrate_cma(get_pageblock_migratetype(pag > e))) > - return false; > + if (is_migrate_cma_page(page)) { > + /* > + * CMA allocations (alloc_contig_range) really need > to mark > + * isolate CMA pageblocks even when they are not > movable in fact > + * so consider them movable here. > + */ > + if (is_migrate_cma(migratetype)) > + return false; > + > + reason = "CMA page"; > + goto unmovable; > + } > > - pfn = page_to_pfn(page); > - for (found = 0, iter = 0; iter < pageblock_nr_pages; iter++) > { > + for (found = 0; iter < pageblock_nr_pages; iter++) { > unsigned long check = pfn + iter; > > if (!pfn_valid_within(check)) > @@ -8105,7 +8111,7 @@ bool has_unmovable_pages(struct zone *zone, > struct page *page, int count, > unmovable: > WARN_ON_ONCE(zone_idx(zone) == ZONE_MOVABLE); > if (flags & REPORT_FAILURE) > - dump_page(pfn_to_page(pfn+iter), "unmovable page"); > + dump_page(pfn_to_page(pfn + iter), reason); > return true; > } > -- Oscar Salvador SUSE L3