Skip to content

Commit

Permalink
cgroup: factor out cgroup_create() out of cgroup_mkdir()
Browse files Browse the repository at this point in the history
We're in the process of refactoring cgroup and css management paths to
separate them out to eventually allow cgroups which aren't visible
through cgroup fs.  This patch factors out cgroup_create() out of
cgroup_mkdir().  cgroup_create() contains all internal object creation
and initialization.  cgroup_mkdir() uses cgroup_create() to create the
internal cgroup and adds interface directory and file creation.

This patch doesn't cause any behavior differences.

Signed-off-by: Tejun Heo <[email protected]>
Acked-by: Zefan Li <[email protected]>
  • Loading branch information
htejun committed Mar 3, 2016
1 parent 195e9b6 commit a5bca21
Showing 1 changed file with 43 additions and 29 deletions.
72 changes: 43 additions & 29 deletions kernel/cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -4888,33 +4888,19 @@ static struct cgroup_subsys_state *css_create(struct cgroup *cgrp,
return ERR_PTR(err);
}

static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
umode_t mode)
static struct cgroup *cgroup_create(struct cgroup *parent)
{
struct cgroup *parent, *cgrp, *tcgrp;
struct cgroup_root *root;
struct cgroup_root *root = parent->root;
struct cgroup_subsys *ss;
struct kernfs_node *kn;
int level, ssid, ret;

/* Do not accept '\n' to prevent making /proc/<pid>/cgroup unparsable.
*/
if (strchr(name, '\n'))
return -EINVAL;

parent = cgroup_kn_lock_live(parent_kn);
if (!parent)
return -ENODEV;
root = parent->root;
level = parent->level + 1;
struct cgroup *cgrp, *tcgrp;
int level = parent->level + 1;
int ssid, ret;

/* allocate the cgroup and its ID, 0 is reserved for the root */
cgrp = kzalloc(sizeof(*cgrp) +
sizeof(cgrp->ancestor_ids[0]) * (level + 1), GFP_KERNEL);
if (!cgrp) {
ret = -ENOMEM;
goto out_unlock;
}
if (!cgrp)
return ERR_PTR(-ENOMEM);

ret = percpu_ref_init(&cgrp->self.refcnt, css_release, 0, GFP_KERNEL);
if (ret)
Expand Down Expand Up @@ -4978,6 +4964,40 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
cgroup_refresh_subtree_ss_mask(cgrp);
}

return cgrp;

out_cancel_ref:
percpu_ref_exit(&cgrp->self.refcnt);
out_free_cgrp:
kfree(cgrp);
return ERR_PTR(ret);
out_destroy:
cgroup_destroy_locked(cgrp);
return ERR_PTR(ret);
}

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;

/* do not accept '\n' to prevent making /proc/<pid>/cgroup unparsable */
if (strchr(name, '\n'))
return -EINVAL;

parent = cgroup_kn_lock_live(parent_kn);
if (!parent)
return -ENODEV;

cgrp = cgroup_create(parent);
if (IS_ERR(cgrp)) {
ret = PTR_ERR(cgrp);
goto out_unlock;
}

/* create the directory */
kn = kernfs_create_dir(parent->kn, name, mode, cgrp);
if (IS_ERR(kn)) {
Expand Down Expand Up @@ -5012,17 +5032,11 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
ret = 0;
goto out_unlock;

out_cancel_ref:
percpu_ref_exit(&cgrp->self.refcnt);
out_free_cgrp:
kfree(cgrp);
out_destroy:
cgroup_destroy_locked(cgrp);
out_unlock:
cgroup_kn_unlock(parent_kn);
return ret;

out_destroy:
cgroup_destroy_locked(cgrp);
goto out_unlock;
}

/*
Expand Down

0 comments on commit a5bca21

Please sign in to comment.