|
@@ -83,7 +83,7 @@ EXPORT_SYMBOL(vm_stat);
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
#ifdef CONFIG_SMP
|
|
|
|
|
|
-static int calculate_pressure_threshold(struct zone *zone)
|
|
|
|
|
|
+int calculate_pressure_threshold(struct zone *zone)
|
|
{
|
|
{
|
|
int threshold;
|
|
int threshold;
|
|
int watermark_distance;
|
|
int watermark_distance;
|
|
@@ -107,7 +107,7 @@ static int calculate_pressure_threshold(struct zone *zone)
|
|
return threshold;
|
|
return threshold;
|
|
}
|
|
}
|
|
|
|
|
|
-static int calculate_threshold(struct zone *zone)
|
|
|
|
|
|
+int calculate_normal_threshold(struct zone *zone)
|
|
{
|
|
{
|
|
int threshold;
|
|
int threshold;
|
|
int mem; /* memory in 128 MB units */
|
|
int mem; /* memory in 128 MB units */
|
|
@@ -166,7 +166,7 @@ static void refresh_zone_stat_thresholds(void)
|
|
for_each_populated_zone(zone) {
|
|
for_each_populated_zone(zone) {
|
|
unsigned long max_drift, tolerate_drift;
|
|
unsigned long max_drift, tolerate_drift;
|
|
|
|
|
|
- threshold = calculate_threshold(zone);
|
|
|
|
|
|
+ threshold = calculate_normal_threshold(zone);
|
|
|
|
|
|
for_each_online_cpu(cpu)
|
|
for_each_online_cpu(cpu)
|
|
per_cpu_ptr(zone->pageset, cpu)->stat_threshold
|
|
per_cpu_ptr(zone->pageset, cpu)->stat_threshold
|
|
@@ -185,46 +185,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;
|
|
struct zone *zone;
|
|
int cpu;
|
|
int cpu;
|
|
int threshold;
|
|
int threshold;
|
|
int i;
|
|
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++) {
|
|
for (i = 0; i < pgdat->nr_zones; i++) {
|
|
zone = &pgdat->node_zones[i];
|
|
zone = &pgdat->node_zones[i];
|
|
if (!zone->percpu_drift_mark)
|
|
if (!zone->percpu_drift_mark)
|
|
continue;
|
|
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
|
|
per_cpu_ptr(zone->pageset, cpu)->stat_threshold
|
|
= threshold;
|
|
= threshold;
|
|
}
|
|
}
|
|
- put_online_cpus();
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|