cgroup: make cgroup_destroy_locked() test cgroup_is_populated()
cgroup_destroy_locked() currently tests whether any css_sets are associated to reject removal if the cgroup contains tasks. This works because a css_set's refcnt converges with the number of tasks linked to it and thus there's no css_set linked to a cgroup if it doesn't have any live tasks. To help tracking resource usage of zombie tasks, putting the ref of css_set will be separated from disassociating the task from the css_set which means that a cgroup may have css_sets linked to it even when it doesn't have any live tasks. This patch updates cgroup_destroy_locked() so that it tests cgroup_is_populated(), which counts the number of populated css_sets, instead of whether cgrp->cset_links is empty to determine whether the cgroup is populated or not. This ensures that rmdirs won't be incorrectly rejected for cgroups which only contain zombie tasks. Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
Родитель
2ceb231b0a
Коммит
91486f61f4
|
@ -4998,16 +4998,15 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
|
|||
__releases(&cgroup_mutex) __acquires(&cgroup_mutex)
|
||||
{
|
||||
struct cgroup_subsys_state *css;
|
||||
bool empty;
|
||||
int ssid;
|
||||
|
||||
lockdep_assert_held(&cgroup_mutex);
|
||||
|
||||
/* css_set_rwsem synchronizes access to ->cset_links */
|
||||
down_read(&css_set_rwsem);
|
||||
empty = list_empty(&cgrp->cset_links);
|
||||
up_read(&css_set_rwsem);
|
||||
if (!empty)
|
||||
/*
|
||||
* Only migration can raise populated from zero and we're already
|
||||
* holding cgroup_mutex.
|
||||
*/
|
||||
if (cgroup_is_populated(cgrp))
|
||||
return -EBUSY;
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче