Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1342477
| From | Tejun Heo <tj@kernel.org> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 13/16] cgroup: use cgroup_apply_enable_control() in cgroup creation path |
| Date | 2016-02-24 23:10 +0100 |
| Message-ID | <r5PNa-2Bh-53@gated-at.bofh.it> (permalink) |
| References | <r5PN8-2Bh-3@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
cgroup_create() manually updates control masks and creates child csses
which cgroup_mkdir() then manually populates. Both can be simplified
by using cgroup_apply_enable_control() and friends. The only catch is
that it calls css_populate_dir() with NULL cgroup->kn during
cgroup_create(). This is worked around by making the function noop on
NULL kn.
Signed-off-by: Tejun Heo <tj@kernel.org>
---
kernel/cgroup.c | 38 ++++++++++++++------------------------
1 file changed, 14 insertions(+), 24 deletions(-)
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index b1c6fe2..efeaa54 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -1489,7 +1489,7 @@ static int css_populate_dir(struct cgroup_subsys_state *css,
struct cftype *cfts, *failed_cfts;
int ret;
- if (css->flags & CSS_VISIBLE)
+ if ((css->flags & CSS_VISIBLE) || !cgrp->kn)
return 0;
if (!css->ss) {
@@ -5038,10 +5038,9 @@ static struct cgroup_subsys_state *css_create(struct cgroup *cgrp,
static struct cgroup *cgroup_create(struct cgroup *parent)
{
struct cgroup_root *root = parent->root;
- struct cgroup_subsys *ss;
struct cgroup *cgrp, *tcgrp;
int level = parent->level + 1;
- int ssid, ret;
+ int ret;
/* allocate the cgroup and its ID, 0 is reserved for the root */
cgrp = kzalloc(sizeof(*cgrp) +
@@ -5091,25 +5090,19 @@ static struct cgroup *cgroup_create(struct cgroup *parent)
*/
cgroup_idr_replace(&root->cgroup_idr, cgrp, cgrp->id);
- /* create the csses */
- do_each_subsys_mask(ss, ssid, cgroup_ss_mask(cgrp)) {
- struct cgroup_subsys_state *css;
-
- css = css_create(cgrp, ss);
- if (IS_ERR(css)) {
- ret = PTR_ERR(css);
- goto out_destroy;
- }
- } while_each_subsys_mask();
-
/*
* On the default hierarchy, a child doesn't automatically inherit
* subtree_control from the parent. Each is configured manually.
*/
- if (!cgroup_on_dfl(cgrp)) {
+ if (!cgroup_on_dfl(cgrp))
cgrp->subtree_control = cgroup_control(cgrp);
- cgroup_refresh_subtree_ss_mask(cgrp);
- }
+
+ cgroup_propagate_control(cgrp);
+
+ /* @cgrp doesn't have dir yet so the following will only create csses */
+ ret = cgroup_apply_control_enable(cgrp);
+ if (ret)
+ goto out_destroy;
return cgrp;
@@ -5127,9 +5120,8 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
umode_t mode)
{
struct cgroup *parent, *cgrp;
- struct cgroup_subsys *ss;
struct kernfs_node *kn;
- int ssid, ret;
+ int ret;
/* do not accept '\n' to prevent making /proc/<pid>/cgroup unparsable */
if (strchr(name, '\n'))
@@ -5167,11 +5159,9 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
if (ret)
goto out_destroy;
- do_each_subsys_mask(ss, ssid, cgroup_control(cgrp)) {
- ret = css_populate_dir(cgroup_css(cgrp, ss), NULL);
- if (ret)
- goto out_destroy;
- } while_each_subsys_mask();
+ ret = cgroup_apply_control_enable(cgrp);
+ if (ret)
+ goto out_destroy;
/* let's create and online css's */
kernfs_activate(kn);
--
2.5.0
Back to linux.kernel | Previous | Next | Find similar | Unroll thread
[PATCH 13/16] cgroup: use cgroup_apply_enable_control() in cgroup creation path Tejun Heo <tj@kernel.org> - 2016-02-24 23:10 +0100
csiph-web