On 05/15/2017 10:58 AM, Michal Hocko wrote: > From: Michal Hocko <mhocko@xxxxxxxx> > > __first_valid_page skips over invalid pfns in the range but it might > still stumble over offline pages. At least start_isolate_page_range > will mark those set_migratetype_isolate. This doesn't represent > any immediate AFAICS because alloc_contig_range will fail to isolate > those pages but it relies on not fully initialized page which will > become a problem later when we stop associating offline pages to zones. > Use pfn_to_online_page to handle this. > > This is more a preparatory patch than a fix. > > Signed-off-by: Michal Hocko <mhocko@xxxxxxxx> Iterating over single pages when the whole section is offline seems rather wasteful, but it should be really rare, so whatever. Acked-by: Vlastimil Babka <vbabka@xxxxxxx> > --- > mm/page_isolation.c | 26 ++++++++++++++++++-------- > 1 file changed, 18 insertions(+), 8 deletions(-) > > diff --git a/mm/page_isolation.c b/mm/page_isolation.c > index 5092e4ef00c8..3606104893e0 100644 > --- a/mm/page_isolation.c > +++ b/mm/page_isolation.c > @@ -138,12 +138,18 @@ static inline struct page * > __first_valid_page(unsigned long pfn, unsigned long nr_pages) > { > int i; > - for (i = 0; i < nr_pages; i++) > - if (pfn_valid_within(pfn + i)) > - break; > - if (unlikely(i == nr_pages)) > - return NULL; > - return pfn_to_page(pfn + i); > + > + for (i = 0; i < nr_pages; i++) { > + struct page *page; > + > + if (!pfn_valid_within(pfn + i)) > + continue; > + page = pfn_to_online_page(pfn + i); > + if (!page) > + continue; > + return page; > + } > + return NULL; > } > > /* > @@ -184,8 +190,12 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, > undo: > for (pfn = start_pfn; > pfn < undo_pfn; > - pfn += pageblock_nr_pages) > - unset_migratetype_isolate(pfn_to_page(pfn), migratetype); > + pfn += pageblock_nr_pages) { > + struct page *page = pfn_to_online_page(pfn); > + if (!page) > + continue; > + unset_migratetype_isolate(page, migratetype); > + } > > return -EBUSY; > } > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>