Skip to content

Commit

Permalink
cgroup: remove cgroup_destory_css_killed()
Browse files Browse the repository at this point in the history
cgroup_destroy_css_killed() is cgroup destruction stage which happens
after all csses are offlined.  After the recent updates, it no longer
does anything other than putting the base reference.  This patch
removes the function and makes cgroup_destroy_locked() put the base
ref at the end isntead.

This also makes cgroup->nr_css unnecessary.  Removed.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
  • Loading branch information
Tejun Heo committed May 14, 2014
1 parent 4e4e284 commit 249f346
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 59 deletions.
3 changes: 0 additions & 3 deletions include/linux/cgroup.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,6 @@ struct cgroup {
*/
int id;

/* the number of attached css's */
int nr_css;

/*
* If this cgroup contains any tasks, it contributes one to
* populated_cnt. All children with non-zero popuplated_cnt of
Expand Down
62 changes: 6 additions & 56 deletions kernel/cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,6 @@ static struct cftype cgroup_base_files[];
static void cgroup_put(struct cgroup *cgrp);
static int rebind_subsystems(struct cgroup_root *dst_root,
unsigned int ss_mask);
static void cgroup_destroy_css_killed(struct cgroup *cgrp);
static int cgroup_destroy_locked(struct cgroup *cgrp);
static int create_css(struct cgroup *cgrp, struct cgroup_subsys *ss);
static void kill_css(struct cgroup_subsys_state *css);
Expand Down Expand Up @@ -4169,7 +4168,6 @@ static int online_css(struct cgroup_subsys_state *css)
ret = ss->css_online(css);
if (!ret) {
css->flags |= CSS_ONLINE;
css->cgroup->nr_css++;
rcu_assign_pointer(css->cgroup->subsys[ss->id], css);
}
return ret;
Expand All @@ -4189,7 +4187,6 @@ static void offline_css(struct cgroup_subsys_state *css)
ss->css_offline(css);

css->flags &= ~CSS_ONLINE;
css->cgroup->nr_css--;
RCU_INIT_POINTER(css->cgroup->subsys[ss->id], NULL);

wake_up_all(&css->cgroup->offline_waitq);
Expand Down Expand Up @@ -4374,39 +4371,18 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,

/*
* This is called when the refcnt of a css is confirmed to be killed.
* css_tryget_online() is now guaranteed to fail.
* css_tryget_online() is now guaranteed to fail. Tell the subsystem to
* initate destruction and put the css ref from kill_css().
*/
static void css_killed_work_fn(struct work_struct *work)
{
struct cgroup_subsys_state *css =
container_of(work, struct cgroup_subsys_state, destroy_work);
struct cgroup *cgrp = css->cgroup;

mutex_lock(&cgroup_mutex);

/*
* css_tryget_online() is guaranteed to fail now. Tell subsystems
* to initate destruction.
*/
offline_css(css);

/*
* If @cgrp is marked dead, it's waiting for refs of all css's to
* be disabled before proceeding to the second phase of cgroup
* destruction. If we are the last one, kick it off.
*/
if (!cgrp->nr_css && cgroup_is_dead(cgrp))
cgroup_destroy_css_killed(cgrp);

mutex_unlock(&cgroup_mutex);

/*
* Put the css refs from kill_css(). Each css holds an extra
* reference to the cgroup's dentry and cgroup removal proceeds
* regardless of css refs. On the last put of each css, whenever
* that may be, the extra dentry ref is put so that dentry
* destruction happens only after all css's are released.
*/
css_put(css);
}

Expand Down Expand Up @@ -4518,11 +4494,7 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
*/
set_bit(CGRP_DEAD, &cgrp->flags);

/*
* Initiate massacre of all css's. cgroup_destroy_css_killed()
* will be invoked to perform the rest of destruction once the
* percpu refs of all css's are confirmed to be killed.
*/
/* initiate massacre of all css's */
for_each_css(css, ssid, cgrp)
kill_css(css);

Expand All @@ -4532,15 +4504,6 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
list_del_init(&cgrp->release_list);
raw_spin_unlock(&release_list_lock);

/*
* If @cgrp has css's attached, the second stage of cgroup
* destruction is kicked off from css_killed_work_fn() after the
* refs of all attached css's are killed. If @cgrp doesn't have
* any css, we kick it off here.
*/
if (!cgrp->nr_css)
cgroup_destroy_css_killed(cgrp);

/*
* Remove @cgrp directory along with the base files. @cgrp has an
* extra ref on its kn.
Expand All @@ -4550,25 +4513,12 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
set_bit(CGRP_RELEASABLE, &cgrp->parent->flags);
check_for_release(cgrp->parent);

/* put the base reference */
cgroup_put(cgrp);

return 0;
};

/**
* cgroup_destroy_css_killed - the second step of cgroup destruction
* @cgrp: the cgroup whose csses have just finished offlining
*
* This function is invoked from a work item for a cgroup which is being
* destroyed after all css's are offlined and performs the rest of
* destruction. This is the second step of destruction described in the
* comment above cgroup_destroy_locked().
*/
static void cgroup_destroy_css_killed(struct cgroup *cgrp)
{
lockdep_assert_held(&cgroup_mutex);

cgroup_put(cgrp);
}

static int cgroup_rmdir(struct kernfs_node *kn)
{
struct cgroup *cgrp;
Expand Down

0 comments on commit 249f346

Please sign in to comment.