@@ -1181,7 +1181,19 @@ static void __zone_drain_local_pages(void *arg)
*/
static void __zone_drain_all_pages(struct zone *zone)
{
- on_each_cpu(__zone_drain_local_pages, zone, 1);
+ struct per_cpu_pageset *pcp;
+ cpumask_var_t cpus;
+ int cpu;
+
+ if (likely(zalloc_cpumask_var(&cpus, GFP_ATOMIC | __GFP_NOWARN))) {
+ for_each_online_cpu(cpu)
+ if (per_cpu_ptr(zone->pageset, cpu)->pcp.count)
+ cpumask_set_cpu(cpu, cpus);
+ on_each_cpu_mask(cpus, __zone_drain_local_pages, zone, 1);
+ free_cpumask_var(cpus);
+ } else {
+ on_each_cpu(__zone_drain_local_pages, zone, 1);
+ }
}
#ifdef CONFIG_HIBERNATION