Skip to content

Commit

Permalink
cgroup: separate out cgroup_has_live_children() from cgroup_destroy_l…
Browse files Browse the repository at this point in the history
…ocked()

We're expecting another user.

Signed-off-by: Tejun Heo <[email protected]>
Acked-by: Li Zefan <[email protected]>
  • Loading branch information
htejun committed May 14, 2014
1 parent 9d800df commit cbc125e
Showing 1 changed file with 16 additions and 10 deletions.
26 changes: 16 additions & 10 deletions kernel/cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -3295,6 +3295,21 @@ css_next_descendant_post(struct cgroup_subsys_state *pos,
return css_parent(pos);
}

static bool cgroup_has_live_children(struct cgroup *cgrp)
{
struct cgroup *child;

rcu_read_lock();
list_for_each_entry_rcu(child, &cgrp->children, sibling) {
if (!cgroup_is_dead(child)) {
rcu_read_unlock();
return true;
}
}
rcu_read_unlock();
return false;
}

/**
* css_advance_task_iter - advance a task itererator to the next css_set
* @it: the iterator to advance
Expand Down Expand Up @@ -4465,7 +4480,6 @@ static void kill_css(struct cgroup_subsys_state *css)
static int cgroup_destroy_locked(struct cgroup *cgrp)
__releases(&cgroup_mutex) __acquires(&cgroup_mutex)
{
struct cgroup *child;
struct cgroup_subsys_state *css;
bool empty;
int ssid;
Expand All @@ -4487,15 +4501,7 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
* emptiness as dead children linger on it while being destroyed;
* otherwise, "rmdir parent/child parent" may fail with -EBUSY.
*/
empty = true;
rcu_read_lock();
list_for_each_entry_rcu(child, &cgrp->children, sibling) {
empty = cgroup_is_dead(child);
if (!empty)
break;
}
rcu_read_unlock();
if (!empty)
if (cgroup_has_live_children(cgrp))
return -EBUSY;

/*
Expand Down

0 comments on commit cbc125e

Please sign in to comment.