diff options
author | Mel Gorman <mel@csn.ul.ie> | 2011-01-13 18:45:43 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-13 20:32:31 -0500 |
commit | b44129b30652c8771db2265939bb8b463724043d (patch) | |
tree | d5b669ff4faea020b03e894706f49d5d1ae56907 /mm/vmscan.c | |
parent | 88f5acf88ae6a9778f6d25d0d5d7ec2d57764a97 (diff) |
mm: vmstat: use a single setter function and callback for adjusting percpu thresholds
reduce_pgdat_percpu_threshold() and restore_pgdat_percpu_threshold() exist
to adjust the per-cpu vmstat thresholds while kswapd is awake to avoid
errors due to counter drift. The functions duplicate some code so this
patch replaces them with a single set_pgdat_percpu_threshold() that takes
a callback function to calculate the desired threshold as a parameter.
[akpm@linux-foundation.org: readability tweak]
[kosaki.motohiro@jp.fujitsu.com: set_pgdat_percpu_threshold(): don't use for_each_online_cpu]
Signed-off-by: Mel Gorman <mel@csn.ul.ie>
Reviewed-by: Christoph Lameter <cl@linux.com>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 5da4295e7d67..86f8c3418795 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -2448,9 +2448,24 @@ static int kswapd(void *p) | |||
2448 | */ | 2448 | */ |
2449 | if (!sleeping_prematurely(pgdat, order, remaining)) { | 2449 | if (!sleeping_prematurely(pgdat, order, remaining)) { |
2450 | trace_mm_vmscan_kswapd_sleep(pgdat->node_id); | 2450 | trace_mm_vmscan_kswapd_sleep(pgdat->node_id); |
2451 | restore_pgdat_percpu_threshold(pgdat); | 2451 | |
2452 | /* | ||
2453 | * vmstat counters are not perfectly | ||
2454 | * accurate and the estimated value | ||
2455 | * for counters such as NR_FREE_PAGES | ||
2456 | * can deviate from the true value by | ||
2457 | * nr_online_cpus * threshold. To | ||
2458 | * avoid the zone watermarks being | ||
2459 | * breached while under pressure, we | ||
2460 | * reduce the per-cpu vmstat threshold | ||
2461 | * while kswapd is awake and restore | ||
2462 | * them before going back to sleep. | ||
2463 | */ | ||
2464 | set_pgdat_percpu_threshold(pgdat, | ||
2465 | calculate_normal_threshold); | ||
2452 | schedule(); | 2466 | schedule(); |
2453 | reduce_pgdat_percpu_threshold(pgdat); | 2467 | set_pgdat_percpu_threshold(pgdat, |
2468 | calculate_pressure_threshold); | ||
2454 | } else { | 2469 | } else { |
2455 | if (remaining) | 2470 | if (remaining) |
2456 | count_vm_event(KSWAPD_LOW_WMARK_HIT_QUICKLY); | 2471 | count_vm_event(KSWAPD_LOW_WMARK_HIT_QUICKLY); |