Skip to content

Commit

Permalink
cgroup: Explicitly remove core interface files
Browse files Browse the repository at this point in the history
The "cgroup." core interface files bypass the usual interface removal
path and get removed recursively along with the cgroup itself.  While
this works now, the subtle discrepancy gets in the way of implementing
common mechanisms.

This patch updates cgroup core interface file handling so that it's
consistent with controller interface files.  When added, the css is
marked CSS_VISIBLE and they're explicitly removed before the cgroup is
destroyed.

This doesn't cause user-visible behavior changes.

Signed-off-by: Tejun Heo <[email protected]>
  • Loading branch information
htejun committed Apr 26, 2018
1 parent fe03a75 commit 5faaf05
Showing 1 changed file with 22 additions and 13 deletions.
35 changes: 22 additions & 13 deletions kernel/cgroup/cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -1573,8 +1573,17 @@ static void css_clear_dir(struct cgroup_subsys_state *css)

css->flags &= ~CSS_VISIBLE;

list_for_each_entry(cfts, &css->ss->cfts, node)
if (!css->ss) {
if (cgroup_on_dfl(cgrp))
cfts = cgroup_base_files;
else
cfts = cgroup1_base_files;

cgroup_addrm_files(css, cgrp, cfts, false);
} else {
list_for_each_entry(cfts, &css->ss->cfts, node)
cgroup_addrm_files(css, cgrp, cfts, false);
}
}

/**
Expand All @@ -1598,14 +1607,16 @@ static int css_populate_dir(struct cgroup_subsys_state *css)
else
cfts = cgroup1_base_files;

return cgroup_addrm_files(&cgrp->self, cgrp, cfts, true);
}

list_for_each_entry(cfts, &css->ss->cfts, node) {
ret = cgroup_addrm_files(css, cgrp, cfts, true);
if (ret < 0) {
failed_cfts = cfts;
goto err;
ret = cgroup_addrm_files(&cgrp->self, cgrp, cfts, true);
if (ret < 0)
return ret;
} else {
list_for_each_entry(cfts, &css->ss->cfts, node) {
ret = cgroup_addrm_files(css, cgrp, cfts, true);
if (ret < 0) {
failed_cfts = cfts;
goto err;
}
}
}

Expand Down Expand Up @@ -5090,10 +5101,8 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
for_each_css(css, ssid, cgrp)
kill_css(css);

/*
* Remove @cgrp directory along with the base files. @cgrp has an
* extra ref on its kn.
*/
/* clear and remove @cgrp dir, @cgrp has an extra ref on its kn */
css_clear_dir(&cgrp->self);
kernfs_remove(cgrp->kn);

if (parent && cgroup_is_threaded(cgrp))
Expand Down

0 comments on commit 5faaf05

Please sign in to comment.