Commit 72476ce7 authored by Daisuke Nishimura's avatar Daisuke Nishimura Committed by james toy

Don't do INIT_WORK() repeatedly against the same work_struct. It can

actually lead to a BUG.

Just do it once in initialization.
Acked-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: default avatarDaisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Cc: Balbir Singh <balbir@in.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 9c63e80b
...@@ -1349,8 +1349,8 @@ static void drain_all_stock_async(void) ...@@ -1349,8 +1349,8 @@ static void drain_all_stock_async(void)
/* This function is for scheduling "drain" in asynchronous way. /* This function is for scheduling "drain" in asynchronous way.
* The result of "drain" is not directly handled by callers. Then, * The result of "drain" is not directly handled by callers. Then,
* if someone is calling drain, we don't have to call drain more. * if someone is calling drain, we don't have to call drain more.
* Anyway, work_pending() will catch if there is a race. We just do * Anyway, WORK_STRUCT_PENDING check in queue_work_on() will catch if
* loose check here. * there is a race. We just do loose check here.
*/ */
if (atomic_read(&memcg_drain_count)) if (atomic_read(&memcg_drain_count))
return; return;
...@@ -1359,9 +1359,6 @@ static void drain_all_stock_async(void) ...@@ -1359,9 +1359,6 @@ static void drain_all_stock_async(void)
get_online_cpus(); get_online_cpus();
for_each_online_cpu(cpu) { for_each_online_cpu(cpu) {
struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu);
if (work_pending(&stock->work))
continue;
INIT_WORK(&stock->work, drain_local_stock);
schedule_work_on(cpu, &stock->work); schedule_work_on(cpu, &stock->work);
} }
put_online_cpus(); put_online_cpus();
...@@ -3327,11 +3324,17 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont) ...@@ -3327,11 +3324,17 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
/* root ? */ /* root ? */
if (cont->parent == NULL) { if (cont->parent == NULL) {
int cpu;
enable_swap_cgroup(); enable_swap_cgroup();
parent = NULL; parent = NULL;
root_mem_cgroup = mem; root_mem_cgroup = mem;
if (mem_cgroup_soft_limit_tree_init()) if (mem_cgroup_soft_limit_tree_init())
goto free_out; goto free_out;
for_each_possible_cpu(cpu) {
struct memcg_stock_pcp *stock =
&per_cpu(memcg_stock, cpu);
INIT_WORK(&stock->work, drain_local_stock);
}
hotcpu_notifier(memcg_stock_cpu_callback, 0); hotcpu_notifier(memcg_stock_cpu_callback, 0);
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment