Skip to content

Commit 2ce1364

Browse files
Michal Hockotorvalds
authored andcommitted
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: http://lkml.kernel.org/r/[email protected] Signed-off-by: Michal Hocko <[email protected]> Acked-by: Vlastimil Babka <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Andrea Arcangeli <[email protected]> Cc: Balbir Singh <[email protected]> Cc: Dan Williams <[email protected]> Cc: Daniel Kiper <[email protected]> Cc: David Rientjes <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: Igor Mammedov <[email protected]> Cc: Jerome Glisse <[email protected]> Cc: Joonsoo Kim <[email protected]> Cc: Martin Schwidefsky <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Reza Arbab <[email protected]> Cc: Tobias Regnery <[email protected]> Cc: Toshi Kani <[email protected]> Cc: Vitaly Kuznetsov <[email protected]> Cc: Xishi Qiu <[email protected]> Cc: Yasuaki Ishimatsu <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent ccbe1e4 commit 2ce1364

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

mm/page_isolation.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,18 @@ static inline struct page *
138138
__first_valid_page(unsigned long pfn, unsigned long nr_pages)
139139
{
140140
int i;
141-
for (i = 0; i < nr_pages; i++)
142-
if (pfn_valid_within(pfn + i))
143-
break;
144-
if (unlikely(i == nr_pages))
145-
return NULL;
146-
return pfn_to_page(pfn + i);
141+
142+
for (i = 0; i < nr_pages; i++) {
143+
struct page *page;
144+
145+
if (!pfn_valid_within(pfn + i))
146+
continue;
147+
page = pfn_to_online_page(pfn + i);
148+
if (!page)
149+
continue;
150+
return page;
151+
}
152+
return NULL;
147153
}
148154

149155
/*
@@ -184,8 +190,12 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn,
184190
undo:
185191
for (pfn = start_pfn;
186192
pfn < undo_pfn;
187-
pfn += pageblock_nr_pages)
188-
unset_migratetype_isolate(pfn_to_page(pfn), migratetype);
193+
pfn += pageblock_nr_pages) {
194+
struct page *page = pfn_to_online_page(pfn);
195+
if (!page)
196+
continue;
197+
unset_migratetype_isolate(page, migratetype);
198+
}
189199

190200
return -EBUSY;
191201
}

0 commit comments

Comments
 (0)