Commit 2ce13640 authored by Michal Hocko's avatar Michal Hocko Committed by Linus Torvalds

mm: __first_valid_page skip over offline pages

__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.

Link: default avatarMichal Hocko <>
Acked-by: default avatarVlastimil Babka <>
Cc: Andi Kleen <>
Cc: Andrea Arcangeli <>
Cc: Balbir Singh <>
Cc: Dan Williams <>
Cc: Daniel Kiper <>
Cc: David Rientjes <>
Cc: Heiko Carstens <>
Cc: Igor Mammedov <>
Cc: Jerome Glisse <>
Cc: Joonsoo Kim <>
Cc: Martin Schwidefsky <>
Cc: Mel Gorman <>
Cc: Reza Arbab <>
Cc: Tobias Regnery <>
Cc: Toshi Kani <>
Cc: Vitaly Kuznetsov <>
Cc: Xishi Qiu <>
Cc: Yasuaki Ishimatsu <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarLinus Torvalds <>
parent ccbe1e4d
......@@ -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))
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))
page = pfn_to_online_page(pfn + i);
if (!page)
return page;
return NULL;
......@@ -184,8 +190,12 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn,
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)
unset_migratetype_isolate(page, migratetype);
return -EBUSY;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment