mirror of
https://github.com/torvalds/linux.git
synced 2026-10-07 05:31:08 -04:00
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]>
This commit is contained in:
1 parent
ccbe1e4dde
commit
2ce13640b3
1 file changed
+18
-8
+18
-8
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user