vmscan: separate sc.swap_cluster_max and sc.nr_max_reclaim
Currently, sc.scap_cluster_max has double meanings. 1) reclaim batch size as isolate_lru_pages()'s argument 2) reclaim baling out thresolds The two meanings pretty unrelated. Thus, Let's separate it. this patch doesn't change any behavior. Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Reviewed-by: Rik van Riel <riel@redhat.com> Reviewed-by: Minchan Kim <minchan.kim@gmail.com> Cc: Mel Gorman <mel@csn.ul.ie> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
cba5dd7fa5
commit
22fba33545
25
mm/vmscan.c
25
mm/vmscan.c
|
@ -55,6 +55,9 @@ struct scan_control {
|
|||
/* Number of pages freed so far during a call to shrink_zones() */
|
||||
unsigned long nr_reclaimed;
|
||||
|
||||
/* How many pages shrink_list() should reclaim */
|
||||
unsigned long nr_to_reclaim;
|
||||
|
||||
/* This context's GFP mask */
|
||||
gfp_t gfp_mask;
|
||||
|
||||
|
@ -1595,6 +1598,7 @@ static void shrink_zone(int priority, struct zone *zone,
|
|||
enum lru_list l;
|
||||
unsigned long nr_reclaimed = sc->nr_reclaimed;
|
||||
unsigned long swap_cluster_max = sc->swap_cluster_max;
|
||||
unsigned long nr_to_reclaim = sc->nr_to_reclaim;
|
||||
struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc);
|
||||
int noswap = 0;
|
||||
|
||||
|
@ -1639,8 +1643,7 @@ static void shrink_zone(int priority, struct zone *zone,
|
|||
* with multiple processes reclaiming pages, the total
|
||||
* freeing target can get unreasonably large.
|
||||
*/
|
||||
if (nr_reclaimed > swap_cluster_max &&
|
||||
priority < DEF_PRIORITY && !current_is_kswapd())
|
||||
if (nr_reclaimed > nr_to_reclaim && priority < DEF_PRIORITY)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1738,6 +1741,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
|
|||
struct zoneref *z;
|
||||
struct zone *zone;
|
||||
enum zone_type high_zoneidx = gfp_zone(sc->gfp_mask);
|
||||
unsigned long writeback_threshold;
|
||||
|
||||
delayacct_freepages_start();
|
||||
|
||||
|
@ -1773,7 +1777,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
|
|||
}
|
||||
}
|
||||
total_scanned += sc->nr_scanned;
|
||||
if (sc->nr_reclaimed >= sc->swap_cluster_max) {
|
||||
if (sc->nr_reclaimed >= sc->nr_to_reclaim) {
|
||||
ret = sc->nr_reclaimed;
|
||||
goto out;
|
||||
}
|
||||
|
@ -1785,8 +1789,8 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
|
|||
* that's undesirable in laptop mode, where we *want* lumpy
|
||||
* writeout. So in laptop mode, write out the whole world.
|
||||
*/
|
||||
if (total_scanned > sc->swap_cluster_max +
|
||||
sc->swap_cluster_max / 2) {
|
||||
writeback_threshold = sc->nr_to_reclaim + sc->nr_to_reclaim / 2;
|
||||
if (total_scanned > writeback_threshold) {
|
||||
wakeup_flusher_threads(laptop_mode ? 0 : total_scanned);
|
||||
sc->may_writepage = 1;
|
||||
}
|
||||
|
@ -1832,6 +1836,7 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
|
|||
.gfp_mask = gfp_mask,
|
||||
.may_writepage = !laptop_mode,
|
||||
.swap_cluster_max = SWAP_CLUSTER_MAX,
|
||||
.nr_to_reclaim = SWAP_CLUSTER_MAX,
|
||||
.may_unmap = 1,
|
||||
.may_swap = 1,
|
||||
.swappiness = vm_swappiness,
|
||||
|
@ -1890,6 +1895,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont,
|
|||
.may_unmap = 1,
|
||||
.may_swap = !noswap,
|
||||
.swap_cluster_max = SWAP_CLUSTER_MAX,
|
||||
.nr_to_reclaim = SWAP_CLUSTER_MAX,
|
||||
.swappiness = swappiness,
|
||||
.order = 0,
|
||||
.mem_cgroup = mem_cont,
|
||||
|
@ -1961,6 +1967,11 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order)
|
|||
.may_unmap = 1,
|
||||
.may_swap = 1,
|
||||
.swap_cluster_max = SWAP_CLUSTER_MAX,
|
||||
/*
|
||||
* kswapd doesn't want to be bailed out while reclaim. because
|
||||
* we want to put equal scanning pressure on each zone.
|
||||
*/
|
||||
.nr_to_reclaim = ULONG_MAX,
|
||||
.swappiness = vm_swappiness,
|
||||
.order = order,
|
||||
.mem_cgroup = NULL,
|
||||
|
@ -2630,7 +2641,9 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
|
|||
.may_unmap = !!(zone_reclaim_mode & RECLAIM_SWAP),
|
||||
.may_swap = 1,
|
||||
.swap_cluster_max = max_t(unsigned long, nr_pages,
|
||||
SWAP_CLUSTER_MAX),
|
||||
SWAP_CLUSTER_MAX),
|
||||
.nr_to_reclaim = max_t(unsigned long, nr_pages,
|
||||
SWAP_CLUSTER_MAX),
|
||||
.gfp_mask = gfp_mask,
|
||||
.swappiness = vm_swappiness,
|
||||
.order = order,
|
||||
|
|
Loading…
Reference in New Issue