|
|
@@ -1326,23 +1326,27 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn,
|
|
|
static unsigned long scan_movable_pages(unsigned long start, unsigned long end)
|
|
|
{
|
|
|
unsigned long pfn;
|
|
|
- struct page *page;
|
|
|
+
|
|
|
for (pfn = start; pfn < end; pfn++) {
|
|
|
- if (pfn_valid(pfn)) {
|
|
|
- page = pfn_to_page(pfn);
|
|
|
- if (PageLRU(page))
|
|
|
- return pfn;
|
|
|
- if (__PageMovable(page))
|
|
|
- return pfn;
|
|
|
- if (PageHuge(page)) {
|
|
|
- if (hugepage_migration_supported(page_hstate(page)) &&
|
|
|
- page_huge_active(page))
|
|
|
- return pfn;
|
|
|
- else
|
|
|
- pfn = round_up(pfn + 1,
|
|
|
- 1 << compound_order(page)) - 1;
|
|
|
- }
|
|
|
- }
|
|
|
+ struct page *page, *head;
|
|
|
+ unsigned long skip;
|
|
|
+
|
|
|
+ if (!pfn_valid(pfn))
|
|
|
+ continue;
|
|
|
+ page = pfn_to_page(pfn);
|
|
|
+ if (PageLRU(page))
|
|
|
+ return pfn;
|
|
|
+ if (__PageMovable(page))
|
|
|
+ return pfn;
|
|
|
+
|
|
|
+ if (!PageHuge(page))
|
|
|
+ continue;
|
|
|
+ head = compound_head(page);
|
|
|
+ if (hugepage_migration_supported(page_hstate(head)) &&
|
|
|
+ page_huge_active(head))
|
|
|
+ return pfn;
|
|
|
+ skip = (1 << compound_order(head)) - (page - head);
|
|
|
+ pfn += skip - 1;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|