mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
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. [[email protected]: readability tweak] [[email protected]: set_pgdat_percpu_threshold(): don't use for_each_online_cpu] Signed-off-by: Mel Gorman <[email protected]> Reviewed-by: Christoph Lameter <[email protected]> Reviewed-by: KAMEZAWA Hiroyuki <[email protected]> Signed-off-by: KOSAKI Motohiro <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
88f5acf88a
commit
b44129b306
3 changed files with 30 additions and 35 deletions
36
mm/vmstat.c
36
mm/vmstat.c
|
|
@ -83,7 +83,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;
|
||||
|
|
@ -107,7 +107,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 */
|
||||
|
|
@ -166,7 +166,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
|
||||
|
|
@ -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;
|
||||
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)
|
||||
threshold = (*calculate_pressure)(zone);
|
||||
for_each_possible_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)
|
||||
per_cpu_ptr(zone->pageset, cpu)->stat_threshold
|
||||
= threshold;
|
||||
}
|
||||
put_online_cpus();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue