|
@@ -1123,10 +1123,19 @@ static void change_pageblock_range(struct page *pageblock_page,
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * If breaking a large block of pages, move all free pages to the preferred
|
|
|
- * allocation list. If falling back for a reclaimable kernel allocation, be
|
|
|
- * more aggressive about taking ownership of free pages. If we claim more than
|
|
|
- * half of the pageblock, change pageblock's migratetype as well.
|
|
|
+ * When we are falling back to another migratetype during allocation, try to
|
|
|
+ * steal extra free pages from the same pageblocks to satisfy further
|
|
|
+ * allocations, instead of polluting multiple pageblocks.
|
|
|
+ *
|
|
|
+ * If we are stealing a relatively large buddy page, it is likely there will
|
|
|
+ * be more free pages in the pageblock, so try to steal them all. For
|
|
|
+ * reclaimable and unmovable allocations, we steal regardless of page size,
|
|
|
+ * as fragmentation caused by those allocations polluting movable pageblocks
|
|
|
+ * is worse than movable allocations stealing from unmovable and reclaimable
|
|
|
+ * pageblocks.
|
|
|
+ *
|
|
|
+ * If we claim more than half of the pageblock, change pageblock's migratetype
|
|
|
+ * as well.
|
|
|
*/
|
|
|
static void try_to_steal_freepages(struct zone *zone, struct page *page,
|
|
|
int start_type, int fallback_type)
|
|
@@ -1141,6 +1150,7 @@ static void try_to_steal_freepages(struct zone *zone, struct page *page,
|
|
|
|
|
|
if (current_order >= pageblock_order / 2 ||
|
|
|
start_type == MIGRATE_RECLAIMABLE ||
|
|
|
+ start_type == MIGRATE_UNMOVABLE ||
|
|
|
page_group_by_mobility_disabled) {
|
|
|
int pages;
|
|
|
|