|
@@ -138,11 +138,24 @@ static void refresh_zone_stat_thresholds(void)
|
|
|
int threshold;
|
|
|
|
|
|
for_each_populated_zone(zone) {
|
|
|
+ unsigned long max_drift, tolerate_drift;
|
|
|
+
|
|
|
threshold = calculate_threshold(zone);
|
|
|
|
|
|
for_each_online_cpu(cpu)
|
|
|
per_cpu_ptr(zone->pageset, cpu)->stat_threshold
|
|
|
= threshold;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Only set percpu_drift_mark if there is a danger that
|
|
|
+ * NR_FREE_PAGES reports the low watermark is ok when in fact
|
|
|
+ * the min watermark could be breached by an allocation
|
|
|
+ */
|
|
|
+ tolerate_drift = low_wmark_pages(zone) - min_wmark_pages(zone);
|
|
|
+ max_drift = num_online_cpus() * threshold;
|
|
|
+ if (max_drift > tolerate_drift)
|
|
|
+ zone->percpu_drift_mark = high_wmark_pages(zone) +
|
|
|
+ max_drift;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -813,7 +826,7 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat,
|
|
|
"\n scanned %lu"
|
|
|
"\n spanned %lu"
|
|
|
"\n present %lu",
|
|
|
- zone_page_state(zone, NR_FREE_PAGES),
|
|
|
+ zone_nr_free_pages(zone),
|
|
|
min_wmark_pages(zone),
|
|
|
low_wmark_pages(zone),
|
|
|
high_wmark_pages(zone),
|