aboutsummaryrefslogtreecommitdiff
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 2c12348ac..1135f4a10 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1318,7 +1318,8 @@ static int preferred_mt = MIGRATE_MOVABLE;
* 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)
+ int start_type, int fallback_type,
+ int start_order)
{
int current_order = page_order(page);
@@ -1330,7 +1331,8 @@ 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 ||
+ // allow unmovable allocs up to 64K without migrating blocks
+ (start_type == MIGRATE_UNMOVABLE && start_order >= 5) ||
page_group_by_mobility_disabled) {
int pages;
@@ -1408,8 +1410,8 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
if (!is_migrate_cma(migratetype)) {
try_to_steal_freepages(zone, page,
- start_migratetype,
- migratetype);
+ start_migratetype,
+ migratetype, order);
} else {
/*
* When borrowing from MIGRATE_CMA, we need to