diff options
Diffstat (limited to 'mm/compaction.c')
| -rw-r--r-- | mm/compaction.c | 53 | 
1 files changed, 35 insertions, 18 deletions
diff --git a/mm/compaction.c b/mm/compaction.c index d9ebebe1a2a..36f0f61f4a2 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -675,44 +675,61 @@ unsigned long try_to_compact_pages(struct zonelist *zonelist,  /* Compact all zones within a node */ -static int compact_node(int nid) +static int __compact_pgdat(pg_data_t *pgdat, struct compact_control *cc)  {  	int zoneid; -	pg_data_t *pgdat;  	struct zone *zone; -	if (nid < 0 || nid >= nr_node_ids || !node_online(nid)) -		return -EINVAL; -	pgdat = NODE_DATA(nid); -  	/* Flush pending updates to the LRU lists */  	lru_add_drain_all();  	for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) { -		struct compact_control cc = { -			.nr_freepages = 0, -			.nr_migratepages = 0, -			.order = -1, -			.sync = true, -		};  		zone = &pgdat->node_zones[zoneid];  		if (!populated_zone(zone))  			continue; -		cc.zone = zone; -		INIT_LIST_HEAD(&cc.freepages); -		INIT_LIST_HEAD(&cc.migratepages); +		cc->nr_freepages = 0; +		cc->nr_migratepages = 0; +		cc->zone = zone; +		INIT_LIST_HEAD(&cc->freepages); +		INIT_LIST_HEAD(&cc->migratepages); -		compact_zone(zone, &cc); +		if (cc->order < 0 || !compaction_deferred(zone)) +			compact_zone(zone, cc); -		VM_BUG_ON(!list_empty(&cc.freepages)); -		VM_BUG_ON(!list_empty(&cc.migratepages)); +		VM_BUG_ON(!list_empty(&cc->freepages)); +		VM_BUG_ON(!list_empty(&cc->migratepages));  	}  	return 0;  } +int compact_pgdat(pg_data_t *pgdat, int order) +{ +	struct compact_control cc = { +		.order = order, +		.sync = false, +	}; + +	return __compact_pgdat(pgdat, &cc); +} + +static int compact_node(int nid) +{ +	pg_data_t *pgdat; +	struct compact_control cc = { +		.order = -1, +		.sync = true, +	}; + +	if (nid < 0 || nid >= nr_node_ids || !node_online(nid)) +		return -EINVAL; +	pgdat = NODE_DATA(nid); + +	return __compact_pgdat(pgdat, &cc); +} +  /* Compact all nodes in the system */  static int compact_nodes(void)  {  |