|
@@ -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;
|
|
|
}
|