|
@@ -783,6 +783,17 @@ static int move_freepages_block(struct zone *zone, struct page *page,
|
|
return move_freepages(zone, start_page, end_page, migratetype);
|
|
return move_freepages(zone, start_page, end_page, migratetype);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void change_pageblock_range(struct page *pageblock_page,
|
|
|
|
+ int start_order, int migratetype)
|
|
|
|
+{
|
|
|
|
+ int nr_pageblocks = 1 << (start_order - pageblock_order);
|
|
|
|
+
|
|
|
|
+ while (nr_pageblocks--) {
|
|
|
|
+ set_pageblock_migratetype(pageblock_page, migratetype);
|
|
|
|
+ pageblock_page += pageblock_nr_pages;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/* Remove an element from the buddy allocator from the fallback list */
|
|
/* Remove an element from the buddy allocator from the fallback list */
|
|
static inline struct page *
|
|
static inline struct page *
|
|
__rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
|
|
__rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
|
|
@@ -836,8 +847,9 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
|
|
list_del(&page->lru);
|
|
list_del(&page->lru);
|
|
rmv_page_order(page);
|
|
rmv_page_order(page);
|
|
|
|
|
|
- if (current_order == pageblock_order)
|
|
|
|
- set_pageblock_migratetype(page,
|
|
|
|
|
|
+ /* Take ownership for orders >= pageblock_order */
|
|
|
|
+ if (current_order >= pageblock_order)
|
|
|
|
+ change_pageblock_range(page, current_order,
|
|
start_migratetype);
|
|
start_migratetype);
|
|
|
|
|
|
expand(zone, page, order, current_order, area, migratetype);
|
|
expand(zone, page, order, current_order, area, migratetype);
|