mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
cgroup: fix potential deadlock in pre_destroy
As Balbir pointed out, memcg's pre_destroy handler has potential deadlock. It has following lock sequence. cgroup_mutex (cgroup_rmdir) -> pre_destroy -> mem_cgroup_pre_destroy-> force_empty -> cpu_hotplug.lock. (lru_add_drain_all-> schedule_work-> get_online_cpus) But, cpuset has following. cpu_hotplug.lock (call notifier) -> cgroup_mutex. (within notifier) Then, this lock sequence should be fixed. Considering how pre_destroy works, it's not necessary to holding cgroup_mutex() while calling it. As a side effect, we don't have to wait at this mutex while memcg's force_empty works.(it can be long when there are tons of pages.) Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com> Cc: Li Zefan <lizf@cn.fujitsu.com> Cc: Paul Menage <menage@google.com> Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
0ae15132a4
commit
3fa59dfbc3
1 changed files with 9 additions and 5 deletions
|
@ -2472,10 +2472,7 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry)
|
||||||
mutex_unlock(&cgroup_mutex);
|
mutex_unlock(&cgroup_mutex);
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
mutex_unlock(&cgroup_mutex);
|
||||||
parent = cgrp->parent;
|
|
||||||
root = cgrp->root;
|
|
||||||
sb = root->sb;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call pre_destroy handlers of subsys. Notify subsystems
|
* Call pre_destroy handlers of subsys. Notify subsystems
|
||||||
|
@ -2483,7 +2480,14 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry)
|
||||||
*/
|
*/
|
||||||
cgroup_call_pre_destroy(cgrp);
|
cgroup_call_pre_destroy(cgrp);
|
||||||
|
|
||||||
if (cgroup_has_css_refs(cgrp)) {
|
mutex_lock(&cgroup_mutex);
|
||||||
|
parent = cgrp->parent;
|
||||||
|
root = cgrp->root;
|
||||||
|
sb = root->sb;
|
||||||
|
|
||||||
|
if (atomic_read(&cgrp->count)
|
||||||
|
|| !list_empty(&cgrp->children)
|
||||||
|
|| cgroup_has_css_refs(cgrp)) {
|
||||||
mutex_unlock(&cgroup_mutex);
|
mutex_unlock(&cgroup_mutex);
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue