diff options
Diffstat (limited to 'mm/vmscan.c')
| -rw-r--r-- | mm/vmscan.c | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 39fdfb14eea..5fa3eda1f03 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -63,6 +63,9 @@ struct scan_control {  	/* Can mapped pages be reclaimed? */  	int may_unmap; +	/* Can pages be swapped as part of reclaim? */ +	int may_swap; +  	/* This context's SWAP_CLUSTER_MAX. If freeing memory for  	 * suspend, we effectively ignore SWAP_CLUSTER_MAX.  	 * In this context, it doesn't matter that we scan the @@ -1380,7 +1383,7 @@ static void get_scan_ratio(struct zone *zone, struct scan_control *sc,  	struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc);  	/* If we have no swap space, do not bother scanning anon pages. */ -	if (nr_swap_pages <= 0) { +	if (!sc->may_swap || (nr_swap_pages <= 0)) {  		percent[0] = 0;  		percent[1] = 100;  		return; @@ -1468,7 +1471,7 @@ static void shrink_zone(int priority, struct zone *zone,  	for_each_evictable_lru(l) {  		int file = is_file_lru(l); -		int scan; +		unsigned long scan;  		scan = zone_nr_pages(zone, sc, l);  		if (priority) { @@ -1697,6 +1700,7 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order,  		.may_writepage = !laptop_mode,  		.swap_cluster_max = SWAP_CLUSTER_MAX,  		.may_unmap = 1, +		.may_swap = 1,  		.swappiness = vm_swappiness,  		.order = order,  		.mem_cgroup = NULL, @@ -1717,6 +1721,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont,  	struct scan_control sc = {  		.may_writepage = !laptop_mode,  		.may_unmap = 1, +		.may_swap = !noswap,  		.swap_cluster_max = SWAP_CLUSTER_MAX,  		.swappiness = swappiness,  		.order = 0, @@ -1726,9 +1731,6 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont,  	};  	struct zonelist *zonelist; -	if (noswap) -		sc.may_unmap = 0; -  	sc.gfp_mask = (gfp_mask & GFP_RECLAIM_MASK) |  			(GFP_HIGHUSER_MOVABLE & ~GFP_RECLAIM_MASK);  	zonelist = NODE_DATA(numa_node_id())->node_zonelists; @@ -1767,6 +1769,7 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order)  	struct scan_control sc = {  		.gfp_mask = GFP_KERNEL,  		.may_unmap = 1, +		.may_swap = 1,  		.swap_cluster_max = SWAP_CLUSTER_MAX,  		.swappiness = vm_swappiness,  		.order = order, @@ -2088,13 +2091,13 @@ static void shrink_all_zones(unsigned long nr_pages, int prio,  				nr_reclaimed += shrink_list(l, nr_to_scan, zone,  								sc, prio);  				if (nr_reclaimed >= nr_pages) { -					sc->nr_reclaimed = nr_reclaimed; +					sc->nr_reclaimed += nr_reclaimed;  					return;  				}  			}  		}  	} -	sc->nr_reclaimed = nr_reclaimed; +	sc->nr_reclaimed += nr_reclaimed;  }  /* @@ -2115,6 +2118,7 @@ unsigned long shrink_all_memory(unsigned long nr_pages)  		.may_unmap = 0,  		.may_writepage = 1,  		.isolate_pages = isolate_pages_global, +		.nr_reclaimed = 0,  	};  	current->reclaim_state = &reclaim_state; @@ -2297,6 +2301,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)  	struct scan_control sc = {  		.may_writepage = !!(zone_reclaim_mode & RECLAIM_WRITE),  		.may_unmap = !!(zone_reclaim_mode & RECLAIM_SWAP), +		.may_swap = 1,  		.swap_cluster_max = max_t(unsigned long, nr_pages,  					SWAP_CLUSTER_MAX),  		.gfp_mask = gfp_mask,  | 
