diff options
Diffstat (limited to 'mm/vmstat.c')
| -rw-r--r-- | mm/vmstat.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/mm/vmstat.c b/mm/vmstat.c index f389168f9a83..355a9e669aaa 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c | |||
| @@ -138,11 +138,24 @@ static void refresh_zone_stat_thresholds(void) | |||
| 138 | int threshold; | 138 | int threshold; |
| 139 | 139 | ||
| 140 | for_each_populated_zone(zone) { | 140 | for_each_populated_zone(zone) { |
| 141 | unsigned long max_drift, tolerate_drift; | ||
| 142 | |||
| 141 | threshold = calculate_threshold(zone); | 143 | threshold = calculate_threshold(zone); |
| 142 | 144 | ||
| 143 | for_each_online_cpu(cpu) | 145 | for_each_online_cpu(cpu) |
| 144 | per_cpu_ptr(zone->pageset, cpu)->stat_threshold | 146 | per_cpu_ptr(zone->pageset, cpu)->stat_threshold |
| 145 | = threshold; | 147 | = threshold; |
| 148 | |||
| 149 | /* | ||
| 150 | * Only set percpu_drift_mark if there is a danger that | ||
| 151 | * NR_FREE_PAGES reports the low watermark is ok when in fact | ||
| 152 | * the min watermark could be breached by an allocation | ||
| 153 | */ | ||
| 154 | tolerate_drift = low_wmark_pages(zone) - min_wmark_pages(zone); | ||
| 155 | max_drift = num_online_cpus() * threshold; | ||
| 156 | if (max_drift > tolerate_drift) | ||
| 157 | zone->percpu_drift_mark = high_wmark_pages(zone) + | ||
| 158 | max_drift; | ||
| 146 | } | 159 | } |
| 147 | } | 160 | } |
| 148 | 161 | ||
| @@ -813,7 +826,7 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat, | |||
| 813 | "\n scanned %lu" | 826 | "\n scanned %lu" |
| 814 | "\n spanned %lu" | 827 | "\n spanned %lu" |
| 815 | "\n present %lu", | 828 | "\n present %lu", |
| 816 | zone_page_state(zone, NR_FREE_PAGES), | 829 | zone_nr_free_pages(zone), |
| 817 | min_wmark_pages(zone), | 830 | min_wmark_pages(zone), |
| 818 | low_wmark_pages(zone), | 831 | low_wmark_pages(zone), |
| 819 | high_wmark_pages(zone), | 832 | high_wmark_pages(zone), |
| @@ -998,6 +1011,7 @@ static int __cpuinit vmstat_cpuup_callback(struct notifier_block *nfb, | |||
| 998 | switch (action) { | 1011 | switch (action) { |
| 999 | case CPU_ONLINE: | 1012 | case CPU_ONLINE: |
| 1000 | case CPU_ONLINE_FROZEN: | 1013 | case CPU_ONLINE_FROZEN: |
| 1014 | refresh_zone_stat_thresholds(); | ||
| 1001 | start_cpu_timer(cpu); | 1015 | start_cpu_timer(cpu); |
| 1002 | node_set_state(cpu_to_node(cpu), N_CPU); | 1016 | node_set_state(cpu_to_node(cpu), N_CPU); |
| 1003 | break; | 1017 | break; |
