diff options
Diffstat (limited to 'mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch')
-rw-r--r-- | mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch | 167 |
1 files changed, 0 insertions, 167 deletions
diff --git a/mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch b/mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch deleted file mode 100644 index 058b1399a..000000000 --- a/mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch +++ /dev/null @@ -1,167 +0,0 @@ -From 82e3d4969144377d13da97d511e849e8cf3e6dcc Mon Sep 17 00:00:00 2001 -From: Mel Gorman <mel@csn.ul.ie> -Date: Wed, 24 Nov 2010 22:24:24 -0500 -Subject: [PATCH 2/2] 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. - -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: Andrew Morton <akpm@linux-foundation.org> -[the various mmotm patches updating this were rolled up. --kyle] -[[http://userweb.kernel.org/~akpm/mmotm/broken-out/mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds-fix-set_pgdat_percpu_threshold-dont-use-for_each_online_cpu.patch]] ---- - include/linux/vmstat.h | 10 ++++++---- - mm/vmscan.c | 19 +++++++++++++++++-- - mm/vmstat.c | 36 +++++++----------------------------- - 3 files changed, 30 insertions(+), 35 deletions(-) - -diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h -index e4cc21c..833e676 100644 ---- a/include/linux/vmstat.h -+++ b/include/linux/vmstat.h -@@ -254,8 +254,11 @@ extern void dec_zone_state(struct zone *, enum zone_stat_item); - extern void __dec_zone_state(struct zone *, enum zone_stat_item); - - void refresh_cpu_vm_stats(int); --void reduce_pgdat_percpu_threshold(pg_data_t *pgdat); --void restore_pgdat_percpu_threshold(pg_data_t *pgdat); -+ -+int calculate_pressure_threshold(struct zone *zone); -+int calculate_normal_threshold(struct zone *zone); -+void set_pgdat_percpu_threshold(pg_data_t *pgdat, -+ int (*calculate_pressure)(struct zone *)); - #else /* CONFIG_SMP */ - - /* -@@ -300,8 +303,7 @@ static inline void __dec_zone_page_state(struct page *page, - #define dec_zone_page_state __dec_zone_page_state - #define mod_zone_page_state __mod_zone_page_state - --static inline void reduce_pgdat_percpu_threshold(pg_data_t *pgdat) { } --static inline void restore_pgdat_percpu_threshold(pg_data_t *pgdat) { } -+#define set_pgdat_percpu_threshold(pgdat, callback) { } - - static inline void refresh_cpu_vm_stats(int cpu) { } - #endif -diff --git a/mm/vmscan.c b/mm/vmscan.c -index 3e71cb1..ba39948 100644 ---- a/mm/vmscan.c -+++ b/mm/vmscan.c -@@ -2378,9 +2378,24 @@ static int kswapd(void *p) - */ - if (!sleeping_prematurely(pgdat, order, remaining)) { - trace_mm_vmscan_kswapd_sleep(pgdat->node_id); -- restore_pgdat_percpu_threshold(pgdat); -+ -+ /* -+ * vmstat counters are not perfectly -+ * accurate and the estimated value -+ * for counters such as NR_FREE_PAGES -+ * can deviate from the true value by -+ * nr_online_cpus * threshold. To -+ * avoid the zone watermarks being -+ * breached while under pressure, we -+ * reduce the per-cpu vmstat threshold -+ * while kswapd is awake and restore -+ * them before going back to sleep. -+ */ -+ set_pgdat_percpu_threshold(pgdat, -+ calculate_normal_threshold); - schedule(); -- reduce_pgdat_percpu_threshold(pgdat); -+ set_pgdat_percpu_threshold(pgdat, -+ calculate_pressure_threshold); - } else { - if (remaining) - count_vm_event(KSWAPD_LOW_WMARK_HIT_QUICKLY); -diff --git a/mm/vmstat.c b/mm/vmstat.c -index 4d7faeb..511c2c0 100644 ---- a/mm/vmstat.c -+++ b/mm/vmstat.c -@@ -81,7 +81,7 @@ EXPORT_SYMBOL(vm_stat); - - #ifdef CONFIG_SMP - --static int calculate_pressure_threshold(struct zone *zone) -+int calculate_pressure_threshold(struct zone *zone) - { - int threshold; - int watermark_distance; -@@ -105,7 +105,7 @@ static int calculate_pressure_threshold(struct zone *zone) - return threshold; - } - --static int calculate_threshold(struct zone *zone) -+int calculate_normal_threshold(struct zone *zone) - { - int threshold; - int mem; /* memory in 128 MB units */ -@@ -164,7 +164,7 @@ static void refresh_zone_stat_thresholds(void) - for_each_populated_zone(zone) { - unsigned long max_drift, tolerate_drift; - -- threshold = calculate_threshold(zone); -+ threshold = calculate_normal_threshold(zone); - - for_each_online_cpu(cpu) - per_cpu_ptr(zone->pageset, cpu)->stat_threshold -@@ -183,46 +183,24 @@ static void refresh_zone_stat_thresholds(void) - } - } - --void reduce_pgdat_percpu_threshold(pg_data_t *pgdat) -+void set_pgdat_percpu_threshold(pg_data_t *pgdat, -+ int (*calculate_pressure)(struct zone *)) - { - struct zone *zone; - int cpu; - int threshold; - int i; - -- get_online_cpus(); -- for (i = 0; i < pgdat->nr_zones; i++) { -- zone = &pgdat->node_zones[i]; -- if (!zone->percpu_drift_mark) -- continue; -- -- threshold = calculate_pressure_threshold(zone); -- for_each_online_cpu(cpu) -- per_cpu_ptr(zone->pageset, cpu)->stat_threshold -- = threshold; -- } -- put_online_cpus(); --} -- --void restore_pgdat_percpu_threshold(pg_data_t *pgdat) --{ -- struct zone *zone; -- int cpu; -- int threshold; -- int i; -- -- get_online_cpus(); - for (i = 0; i < pgdat->nr_zones; i++) { - zone = &pgdat->node_zones[i]; - if (!zone->percpu_drift_mark) - continue; - -- threshold = calculate_threshold(zone); -- for_each_online_cpu(cpu) -+ threshold = (*calculate_pressure)(zone); -+ for_each_possible_cpu(cpu) - per_cpu_ptr(zone->pageset, cpu)->stat_threshold - = threshold; - } -- put_online_cpus(); - } - - /* --- -1.7.3.2 - |