aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memcontrol.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r--mm/memcontrol.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 04e505bfd7dd..2f5534e1968c 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -2180,11 +2180,8 @@ static void drain_all_stock_async(struct mem_cgroup *root_mem)
2180 struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); 2180 struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu);
2181 struct mem_cgroup *mem; 2181 struct mem_cgroup *mem;
2182 2182
2183 if (cpu == curcpu)
2184 continue;
2185
2186 mem = stock->cached; 2183 mem = stock->cached;
2187 if (!mem) 2184 if (!mem || !stock->nr_pages)
2188 continue; 2185 continue;
2189 if (mem != root_mem) { 2186 if (mem != root_mem) {
2190 if (!root_mem->use_hierarchy) 2187 if (!root_mem->use_hierarchy)
@@ -2193,8 +2190,12 @@ static void drain_all_stock_async(struct mem_cgroup *root_mem)
2193 if (!css_is_ancestor(&mem->css, &root_mem->css)) 2190 if (!css_is_ancestor(&mem->css, &root_mem->css))
2194 continue; 2191 continue;
2195 } 2192 }
2196 if (!test_and_set_bit(FLUSHING_CACHED_CHARGE, &stock->flags)) 2193 if (!test_and_set_bit(FLUSHING_CACHED_CHARGE, &stock->flags)) {
2197 schedule_work_on(cpu, &stock->work); 2194 if (cpu == curcpu)
2195 drain_local_stock(&stock->work);
2196 else
2197 schedule_work_on(cpu, &stock->work);
2198 }
2198 } 2199 }
2199 put_online_cpus(); 2200 put_online_cpus();
2200 mutex_unlock(&percpu_charge_mutex); 2201 mutex_unlock(&percpu_charge_mutex);