Commit 3dd06ffa authored by Tejun Heo's avatar Tejun Heo

cgroup: rename cgroup_dummy_root and related names

The dummy root will be repurposed to serve as the default unified
hierarchy.  Let's rename things in preparation.

* s/cgroup_dummy_root/cgrp_dfl_root/
* s/cgroupfs_root/cgroup_root/ as we don't do fs part directly anymore
* s/cgroup_root->top_cgroup/cgroup_root->cgrp/ for brevity

This is pure rename.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarLi Zefan <lizefan@huawei.com>
parent 94419627
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#ifdef CONFIG_CGROUPS #ifdef CONFIG_CGROUPS
struct cgroupfs_root; struct cgroup_root;
struct cgroup_subsys; struct cgroup_subsys;
struct inode; struct inode;
struct cgroup; struct cgroup;
...@@ -179,7 +179,7 @@ struct cgroup { ...@@ -179,7 +179,7 @@ struct cgroup {
/* Private pointers for each registered subsystem */ /* Private pointers for each registered subsystem */
struct cgroup_subsys_state __rcu *subsys[CGROUP_SUBSYS_COUNT]; struct cgroup_subsys_state __rcu *subsys[CGROUP_SUBSYS_COUNT];
struct cgroupfs_root *root; struct cgroup_root *root;
/* /*
* List of cgrp_cset_links pointing at css_sets with tasks in this * List of cgrp_cset_links pointing at css_sets with tasks in this
...@@ -211,7 +211,7 @@ struct cgroup { ...@@ -211,7 +211,7 @@ struct cgroup {
#define MAX_CGROUP_ROOT_NAMELEN 64 #define MAX_CGROUP_ROOT_NAMELEN 64
/* cgroupfs_root->flags */ /* cgroup_root->flags */
enum { enum {
/* /*
* Unfortunately, cgroup core and various controllers are riddled * Unfortunately, cgroup core and various controllers are riddled
...@@ -272,18 +272,18 @@ enum { ...@@ -272,18 +272,18 @@ enum {
}; };
/* /*
* A cgroupfs_root represents the root of a cgroup hierarchy, and may be * A cgroup_root represents the root of a cgroup hierarchy, and may be
* associated with a kernfs_root to form an active hierarchy. This is * associated with a kernfs_root to form an active hierarchy. This is
* internal to cgroup core. Don't access directly from controllers. * internal to cgroup core. Don't access directly from controllers.
*/ */
struct cgroupfs_root { struct cgroup_root {
struct kernfs_root *kf_root; struct kernfs_root *kf_root;
/* Unique id for this hierarchy. */ /* Unique id for this hierarchy. */
int hierarchy_id; int hierarchy_id;
/* The root cgroup. Root is destroyed on its release. */ /* The root cgroup. Root is destroyed on its release. */
struct cgroup top_cgroup; struct cgroup cgrp;
/* Number of cgroups in the hierarchy, used only for /proc/cgroups */ /* Number of cgroups in the hierarchy, used only for /proc/cgroups */
atomic_t nr_cgrps; atomic_t nr_cgrps;
...@@ -598,7 +598,7 @@ struct cgroup_subsys { ...@@ -598,7 +598,7 @@ struct cgroup_subsys {
const char *name; const char *name;
/* link to parent, protected by cgroup_lock() */ /* link to parent, protected by cgroup_lock() */
struct cgroupfs_root *root; struct cgroup_root *root;
/* /*
* List of cftypes. Each entry is the first entry of an array * List of cftypes. Each entry is the first entry of an array
......
...@@ -138,14 +138,11 @@ static const char *cgroup_subsys_name[] = { ...@@ -138,14 +138,11 @@ static const char *cgroup_subsys_name[] = {
#undef SUBSYS #undef SUBSYS
/* /*
* The dummy hierarchy, reserved for the subsystems that are otherwise * The default hierarchy, reserved for the subsystems that are otherwise
* unattached - it never has more than a single cgroup, and all tasks are * unattached - it never has more than a single cgroup, and all tasks are
* part of that cgroup. * part of that cgroup.
*/ */
static struct cgroupfs_root cgroup_dummy_root; static struct cgroup_root cgrp_dfl_root;
/* dummy_top is a shorthand for the dummy hierarchy's top cgroup */
static struct cgroup * const cgroup_dummy_top = &cgroup_dummy_root.top_cgroup;
/* The list of hierarchy roots */ /* The list of hierarchy roots */
...@@ -175,7 +172,7 @@ static int need_forkexit_callback __read_mostly; ...@@ -175,7 +172,7 @@ static int need_forkexit_callback __read_mostly;
static struct cftype cgroup_base_files[]; static struct cftype cgroup_base_files[];
static void cgroup_put(struct cgroup *cgrp); static void cgroup_put(struct cgroup *cgrp);
static int rebind_subsystems(struct cgroupfs_root *dst_root, static int rebind_subsystems(struct cgroup_root *dst_root,
unsigned long ss_mask); unsigned long ss_mask);
static void cgroup_destroy_css_killed(struct cgroup *cgrp); static void cgroup_destroy_css_killed(struct cgroup *cgrp);
static int cgroup_destroy_locked(struct cgroup *cgrp); static int cgroup_destroy_locked(struct cgroup *cgrp);
...@@ -514,7 +511,7 @@ static struct css_set *find_existing_css_set(struct css_set *old_cset, ...@@ -514,7 +511,7 @@ static struct css_set *find_existing_css_set(struct css_set *old_cset,
struct cgroup *cgrp, struct cgroup *cgrp,
struct cgroup_subsys_state *template[]) struct cgroup_subsys_state *template[])
{ {
struct cgroupfs_root *root = cgrp->root; struct cgroup_root *root = cgrp->root;
struct cgroup_subsys *ss; struct cgroup_subsys *ss;
struct css_set *cset; struct css_set *cset;
unsigned long key; unsigned long key;
...@@ -526,7 +523,7 @@ static struct css_set *find_existing_css_set(struct css_set *old_cset, ...@@ -526,7 +523,7 @@ static struct css_set *find_existing_css_set(struct css_set *old_cset,
* won't change, so no need for locking. * won't change, so no need for locking.
*/ */
for_each_subsys(ss, i) { for_each_subsys(ss, i) {
if (root->top_cgroup.subsys_mask & (1UL << i)) { if (root->cgrp.subsys_mask & (1UL << i)) {
/* Subsystem is in this hierarchy. So we want /* Subsystem is in this hierarchy. So we want
* the subsystem state from the new * the subsystem state from the new
* cgroup */ * cgroup */
...@@ -685,14 +682,14 @@ static struct css_set *find_css_set(struct css_set *old_cset, ...@@ -685,14 +682,14 @@ static struct css_set *find_css_set(struct css_set *old_cset,
return cset; return cset;
} }
static struct cgroupfs_root *cgroup_root_from_kf(struct kernfs_root *kf_root) static struct cgroup_root *cgroup_root_from_kf(struct kernfs_root *kf_root)
{ {
struct cgroup *top_cgrp = kf_root->kn->priv; struct cgroup *root_cgrp = kf_root->kn->priv;
return top_cgrp->root; return root_cgrp->root;
} }
static int cgroup_init_root_id(struct cgroupfs_root *root) static int cgroup_init_root_id(struct cgroup_root *root)
{ {
int id; int id;
...@@ -706,7 +703,7 @@ static int cgroup_init_root_id(struct cgroupfs_root *root) ...@@ -706,7 +703,7 @@ static int cgroup_init_root_id(struct cgroupfs_root *root)
return 0; return 0;
} }
static void cgroup_exit_root_id(struct cgroupfs_root *root) static void cgroup_exit_root_id(struct cgroup_root *root)
{ {
lockdep_assert_held(&cgroup_mutex); lockdep_assert_held(&cgroup_mutex);
...@@ -716,7 +713,7 @@ static void cgroup_exit_root_id(struct cgroupfs_root *root) ...@@ -716,7 +713,7 @@ static void cgroup_exit_root_id(struct cgroupfs_root *root)
} }
} }
static void cgroup_free_root(struct cgroupfs_root *root) static void cgroup_free_root(struct cgroup_root *root)
{ {
if (root) { if (root) {
/* hierarhcy ID shoulid already have been released */ /* hierarhcy ID shoulid already have been released */
...@@ -727,9 +724,9 @@ static void cgroup_free_root(struct cgroupfs_root *root) ...@@ -727,9 +724,9 @@ static void cgroup_free_root(struct cgroupfs_root *root)
} }
} }
static void cgroup_destroy_root(struct cgroupfs_root *root) static void cgroup_destroy_root(struct cgroup_root *root)
{ {
struct cgroup *cgrp = &root->top_cgroup; struct cgroup *cgrp = &root->cgrp;
struct cgrp_cset_link *link, *tmp_link; struct cgrp_cset_link *link, *tmp_link;
mutex_lock(&cgroup_tree_mutex); mutex_lock(&cgroup_tree_mutex);
...@@ -739,7 +736,7 @@ static void cgroup_destroy_root(struct cgroupfs_root *root) ...@@ -739,7 +736,7 @@ static void cgroup_destroy_root(struct cgroupfs_root *root)
BUG_ON(!list_empty(&cgrp->children)); BUG_ON(!list_empty(&cgrp->children));
/* Rebind all subsystems back to the default hierarchy */ /* Rebind all subsystems back to the default hierarchy */
rebind_subsystems(&cgroup_dummy_root, cgrp->subsys_mask); rebind_subsystems(&cgrp_dfl_root, cgrp->subsys_mask);
/* /*
* Release all the links from cset_links to this hierarchy's * Release all the links from cset_links to this hierarchy's
...@@ -770,7 +767,7 @@ static void cgroup_destroy_root(struct cgroupfs_root *root) ...@@ -770,7 +767,7 @@ static void cgroup_destroy_root(struct cgroupfs_root *root)
/* look up cgroup associated with given css_set on the specified hierarchy */ /* look up cgroup associated with given css_set on the specified hierarchy */
static struct cgroup *cset_cgroup_from_root(struct css_set *cset, static struct cgroup *cset_cgroup_from_root(struct css_set *cset,
struct cgroupfs_root *root) struct cgroup_root *root)
{ {
struct cgroup *res = NULL; struct cgroup *res = NULL;
...@@ -778,7 +775,7 @@ static struct cgroup *cset_cgroup_from_root(struct css_set *cset, ...@@ -778,7 +775,7 @@ static struct cgroup *cset_cgroup_from_root(struct css_set *cset,
lockdep_assert_held(&css_set_rwsem); lockdep_assert_held(&css_set_rwsem);
if (cset == &init_css_set) { if (cset == &init_css_set) {
res = &root->top_cgroup; res = &root->cgrp;
} else { } else {
struct cgrp_cset_link *link; struct cgrp_cset_link *link;
...@@ -801,7 +798,7 @@ static struct cgroup *cset_cgroup_from_root(struct css_set *cset, ...@@ -801,7 +798,7 @@ static struct cgroup *cset_cgroup_from_root(struct css_set *cset,
* called with cgroup_mutex and css_set_rwsem held. * called with cgroup_mutex and css_set_rwsem held.
*/ */
static struct cgroup *task_cgroup_from_root(struct task_struct *task, static struct cgroup *task_cgroup_from_root(struct task_struct *task,
struct cgroupfs_root *root) struct cgroup_root *root)
{ {
/* /*
* No need to lock the task - since we hold cgroup_mutex the * No need to lock the task - since we hold cgroup_mutex the
...@@ -837,9 +834,9 @@ static struct cgroup *task_cgroup_from_root(struct task_struct *task, ...@@ -837,9 +834,9 @@ static struct cgroup *task_cgroup_from_root(struct task_struct *task,
* A cgroup can only be deleted if both its 'count' of using tasks * A cgroup can only be deleted if both its 'count' of using tasks
* is zero, and its list of 'children' cgroups is empty. Since all * is zero, and its list of 'children' cgroups is empty. Since all
* tasks in the system use _some_ cgroup, and since there is always at * tasks in the system use _some_ cgroup, and since there is always at
* least one task in the system (init, pid == 1), therefore, top_cgroup * least one task in the system (init, pid == 1), therefore, root cgroup
* always has either children cgroups and/or using tasks. So we don't * always has either children cgroups and/or using tasks. So we don't
* need a special hack to ensure that top_cgroup cannot be deleted. * need a special hack to ensure that root cgroup cannot be deleted.
* *
* P.S. One more locking exception. RCU is used to guard the * P.S. One more locking exception. RCU is used to guard the
* update of a tasks cgroup pointer by cgroup_attach_task() * update of a tasks cgroup pointer by cgroup_attach_task()
...@@ -905,7 +902,7 @@ static void cgroup_free_fn(struct work_struct *work) ...@@ -905,7 +902,7 @@ static void cgroup_free_fn(struct work_struct *work)
kfree(cgrp); kfree(cgrp);
} else { } else {
/* /*
* This is top cgroup's refcnt reaching zero, which * This is root cgroup's refcnt reaching zero, which
* indicates that the root should be released. * indicates that the root should be released.
*/ */
cgroup_destroy_root(cgrp->root); cgroup_destroy_root(cgrp->root);
...@@ -976,10 +973,9 @@ static void cgroup_clear_dir(struct cgroup *cgrp, unsigned long subsys_mask) ...@@ -976,10 +973,9 @@ static void cgroup_clear_dir(struct cgroup *cgrp, unsigned long subsys_mask)
} }
} }
static int rebind_subsystems(struct cgroupfs_root *dst_root, static int rebind_subsystems(struct cgroup_root *dst_root,
unsigned long ss_mask) unsigned long ss_mask)
{ {
struct cgroup *dst_top = &dst_root->top_cgroup;
struct cgroup_subsys *ss; struct cgroup_subsys *ss;
int ssid, ret; int ssid, ret;
...@@ -991,20 +987,20 @@ static int rebind_subsystems(struct cgroupfs_root *dst_root, ...@@ -991,20 +987,20 @@ static int rebind_subsystems(struct cgroupfs_root *dst_root,
continue; continue;
/* if @ss is on the dummy_root, we can always move it */ /* if @ss is on the dummy_root, we can always move it */
if (ss->root == &cgroup_dummy_root) if (ss->root == &cgrp_dfl_root)
continue; continue;
/* if @ss has non-root cgroups attached to it, can't move */ /* if @ss has non-root cgroups attached to it, can't move */
if (!list_empty(&ss->root->top_cgroup.children)) if (!list_empty(&ss->root->cgrp.children))
return -EBUSY; return -EBUSY;
/* can't move between two non-dummy roots either */ /* can't move between two non-dummy roots either */
if (dst_root != &cgroup_dummy_root) if (dst_root != &cgrp_dfl_root)
return -EBUSY; return -EBUSY;
} }
if (dst_root != &cgroup_dummy_root) { if (dst_root != &cgrp_dfl_root) {
ret = cgroup_populate_dir(dst_top, ss_mask); ret = cgroup_populate_dir(&dst_root->cgrp, ss_mask);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -1015,50 +1011,48 @@ static int rebind_subsystems(struct cgroupfs_root *dst_root, ...@@ -1015,50 +1011,48 @@ static int rebind_subsystems(struct cgroupfs_root *dst_root,
*/ */
mutex_unlock(&cgroup_mutex); mutex_unlock(&cgroup_mutex);
for_each_subsys(ss, ssid) for_each_subsys(ss, ssid)
if ((ss_mask & (1 << ssid)) && ss->root != &cgroup_dummy_root) if ((ss_mask & (1 << ssid)) && ss->root != &cgrp_dfl_root)
cgroup_clear_dir(&ss->root->top_cgroup, 1 << ssid); cgroup_clear_dir(&ss->root->cgrp, 1 << ssid);
mutex_lock(&cgroup_mutex); mutex_lock(&cgroup_mutex);
for_each_subsys(ss, ssid) { for_each_subsys(ss, ssid) {
struct cgroupfs_root *src_root; struct cgroup_root *src_root;
struct cgroup *src_top;
struct cgroup_subsys_state *css; struct cgroup_subsys_state *css;
if (!(ss_mask & (1 << ssid))) if (!(ss_mask & (1 << ssid)))
continue; continue;
src_root = ss->root; src_root = ss->root;
src_top = &src_root->top_cgroup; css = cgroup_css(&src_root->cgrp, ss);
css = cgroup_css(src_top, ss);
WARN_ON(!css || cgroup_css(dst_top, ss)); WARN_ON(!css || cgroup_css(&dst_root->cgrp, ss));
RCU_INIT_POINTER(src_top->subsys[ssid], NULL); RCU_INIT_POINTER(src_root->cgrp.subsys[ssid], NULL);
rcu_assign_pointer(dst_top->subsys[ssid], css); rcu_assign_pointer(dst_root->cgrp.subsys[ssid], css);
ss->root = dst_root; ss->root = dst_root;
css->cgroup = dst_top; css->cgroup = &dst_root->cgrp;
src_top->subsys_mask &= ~(1 << ssid); src_root->cgrp.subsys_mask &= ~(1 << ssid);
dst_top->subsys_mask |= 1 << ssid; dst_root->cgrp.subsys_mask |= 1 << ssid;
if (ss->bind) if (ss->bind)
ss->bind(css); ss->bind(css);
} }
if (dst_root != &cgroup_dummy_root) if (dst_root != &cgrp_dfl_root)
kernfs_activate(dst_top->kn); kernfs_activate(dst_root->cgrp.kn);
return 0; return 0;
} }
static int cgroup_show_options(struct seq_file *seq, static int cgroup_show_options(struct seq_file *seq,
struct kernfs_root *kf_root) struct kernfs_root *kf_root)
{ {
struct cgroupfs_root *root = cgroup_root_from_kf(kf_root); struct cgroup_root *root = cgroup_root_from_kf(kf_root);
struct cgroup_subsys *ss; struct cgroup_subsys *ss;
int ssid; int ssid;
for_each_subsys(ss, ssid) for_each_subsys(ss, ssid)
if (root->top_cgroup.subsys_mask & (1 << ssid)) if (root->cgrp.subsys_mask & (1 << ssid))
seq_printf(seq, ",%s", ss->name); seq_printf(seq, ",%s", ss->name);
if (root->flags & CGRP_ROOT_SANE_BEHAVIOR) if (root->flags & CGRP_ROOT_SANE_BEHAVIOR)
seq_puts(seq, ",sane_behavior"); seq_puts(seq, ",sane_behavior");
...@@ -1072,7 +1066,7 @@ static int cgroup_show_options(struct seq_file *seq, ...@@ -1072,7 +1066,7 @@ static int cgroup_show_options(struct seq_file *seq,
seq_printf(seq, ",release_agent=%s", root->release_agent_path); seq_printf(seq, ",release_agent=%s", root->release_agent_path);
spin_unlock(&release_agent_path_lock); spin_unlock(&release_agent_path_lock);
if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->top_cgroup.flags)) if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->cgrp.flags))
seq_puts(seq, ",clone_children"); seq_puts(seq, ",clone_children");
if (strlen(root->name)) if (strlen(root->name))
seq_printf(seq, ",name=%s", root->name); seq_printf(seq, ",name=%s", root->name);
...@@ -1245,7 +1239,7 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts) ...@@ -1245,7 +1239,7 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts)
static int cgroup_remount(struct kernfs_root *kf_root, int *flags, char *data) static int cgroup_remount(struct kernfs_root *kf_root, int *flags, char *data)
{ {
int ret = 0; int ret = 0;
struct cgroupfs_root *root = cgroup_root_from_kf(kf_root); struct cgroup_root *root = cgroup_root_from_kf(kf_root);
struct cgroup_sb_opts opts; struct cgroup_sb_opts opts;
unsigned long added_mask, removed_mask; unsigned long added_mask, removed_mask;
...@@ -1262,12 +1256,12 @@ static int cgroup_remount(struct kernfs_root *kf_root, int *flags, char *data) ...@@ -1262,12 +1256,12 @@ static int cgroup_remount(struct kernfs_root *kf_root, int *flags, char *data)
if (ret) if (ret)
goto out_unlock; goto out_unlock;
if (opts.subsys_mask != root->top_cgroup.subsys_mask || opts.release_agent) if (opts.subsys_mask != root->cgrp.subsys_mask || opts.release_agent)
pr_warning("cgroup: option changes via remount are deprecated (pid=%d comm=%s)\n", pr_warning("cgroup: option changes via remount are deprecated (pid=%d comm=%s)\n",
task_tgid_nr(current), current->comm); task_tgid_nr(current), current->comm);
added_mask = opts.subsys_mask & ~root->top_cgroup.subsys_mask; added_mask = opts.subsys_mask & ~root->cgrp.subsys_mask;
removed_mask = root->top_cgroup.subsys_mask & ~opts.subsys_mask; removed_mask = root->cgrp.subsys_mask & ~opts.subsys_mask;
/* Don't allow flags or name to change at remount */ /* Don't allow flags or name to change at remount */
if (((opts.flags ^ root->flags) & CGRP_ROOT_OPTION_MASK) || if (((opts.flags ^ root->flags) & CGRP_ROOT_OPTION_MASK) ||
...@@ -1280,7 +1274,7 @@ static int cgroup_remount(struct kernfs_root *kf_root, int *flags, char *data) ...@@ -1280,7 +1274,7 @@ static int cgroup_remount(struct kernfs_root *kf_root, int *flags, char *data)
} }
/* remounting is not allowed for populated hierarchies */ /* remounting is not allowed for populated hierarchies */
if (!list_empty(&root->top_cgroup.children)) { if (!list_empty(&root->cgrp.children)) {
ret = -EBUSY; ret = -EBUSY;
goto out_unlock; goto out_unlock;
} }
...@@ -1289,7 +1283,7 @@ static int cgroup_remount(struct kernfs_root *kf_root, int *flags, char *data) ...@@ -1289,7 +1283,7 @@ static int cgroup_remount(struct kernfs_root *kf_root, int *flags, char *data)
if (ret) if (ret)
goto out_unlock; goto out_unlock;
rebind_subsystems(&cgroup_dummy_root, removed_mask); rebind_subsystems(&cgrp_dfl_root, removed_mask);
if (opts.release_agent) { if (opts.release_agent) {
spin_lock(&release_agent_path_lock); spin_lock(&release_agent_path_lock);
...@@ -1368,10 +1362,10 @@ static void init_cgroup_housekeeping(struct cgroup *cgrp) ...@@ -1368,10 +1362,10 @@ static void init_cgroup_housekeeping(struct cgroup *cgrp)
cgrp->dummy_css.cgroup = cgrp; cgrp->dummy_css.cgroup = cgrp;
} }
static void init_cgroup_root(struct cgroupfs_root *root, static void init_cgroup_root(struct cgroup_root *root,
struct cgroup_sb_opts *opts) struct cgroup_sb_opts *opts)
{ {
struct cgroup *cgrp = &root->top_cgroup; struct cgroup *cgrp = &root->cgrp;
INIT_LIST_HEAD(&root->root_list); INIT_LIST_HEAD(&root->root_list);
atomic_set(&root->nr_cgrps, 1); atomic_set(&root->nr_cgrps, 1);
...@@ -1385,13 +1379,13 @@ static void init_cgroup_root(struct cgroupfs_root *root, ...@@ -1385,13 +1379,13 @@ static void init_cgroup_root(struct cgroupfs_root *root,
if (opts->name) if (opts->name)
strcpy(root->name, opts->name); strcpy(root->name, opts->name);
if (opts->cpuset_clone_children) if (opts->cpuset_clone_children)
set_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->top_cgroup.flags); set_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->cgrp.flags);
} }
static int cgroup_setup_root(struct cgroupfs_root *root, unsigned long ss_mask) static int cgroup_setup_root(struct cgroup_root *root, unsigned long ss_mask)
{ {
LIST_HEAD(tmp_links); LIST_HEAD(tmp_links);
struct cgroup *root_cgrp = &root->top_cgroup; struct cgroup *root_cgrp = &root->cgrp;
struct css_set *cset; struct css_set *cset;
int i, ret; int i, ret;
...@@ -1443,7 +1437,7 @@ static int cgroup_setup_root(struct cgroupfs_root *root, unsigned long ss_mask) ...@@ -1443,7 +1437,7 @@ static int cgroup_setup_root(struct cgroupfs_root *root, unsigned long ss_mask)
cgroup_root_count++; cgroup_root_count++;
/* /*
* Link the top cgroup in this hierarchy into all the css_set * Link the root cgroup in this hierarchy into all the css_set
* objects. * objects.
*/ */
down_write(&css_set_rwsem); down_write(&css_set_rwsem);
...@@ -1472,7 +1466,7 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type, ...@@ -1472,7 +1466,7 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
int flags, const char *unused_dev_name, int flags, const char *unused_dev_name,
void *data) void *data)
{ {
struct cgroupfs_root *root; struct cgroup_root *root;
struct cgroup_sb_opts opts; struct cgroup_sb_opts opts;
struct dentry *dentry; struct dentry *dentry;
int ret; int ret;
...@@ -1496,7 +1490,7 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type, ...@@ -1496,7 +1490,7 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
for_each_root(root) { for_each_root(root) {
bool name_match = false; bool name_match = false;
if (root == &cgroup_dummy_root) if (root == &cgrp_dfl_root)
continue; continue;
/* /*
...@@ -1515,7 +1509,7 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type, ...@@ -1515,7 +1509,7 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
* subsystems) then they must match. * subsystems) then they must match.
*/ */
if ((opts.subsys_mask || opts.none) && if ((opts.subsys_mask || opts.none) &&
(opts.subsys_mask != root->top_cgroup.subsys_mask)) { (opts.subsys_mask != root->cgrp.subsys_mask)) {
if (!name_match) if (!name_match)
continue; continue;
ret = -EBUSY; ret = -EBUSY;
...@@ -1533,13 +1527,13 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type, ...@@ -1533,13 +1527,13 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
} }
/* /*
* A root's lifetime is governed by its top cgroup. Zero * A root's lifetime is governed by its root cgroup. Zero
* ref indicate that the root is being destroyed. Wait for * ref indicate that the root is being destroyed. Wait for
* destruction to complete so that the subsystems are free. * destruction to complete so that the subsystems are free.
* We can use wait_queue for the wait but this path is * We can use wait_queue for the wait but this path is
* super cold. Let's just sleep for a bit and retry. * super cold. Let's just sleep for a bit and retry.
*/ */
if (!atomic_inc_not_zero(&root->top_cgroup.refcnt)) { if (!atomic_inc_not_zero(&root->cgrp.refcnt)) {
mutex_unlock(&cgroup_mutex); mutex_unlock(&cgroup_mutex);
mutex_unlock(&cgroup_tree_mutex); mutex_unlock(&cgroup_tree_mutex);
kfree(opts.release_agent); kfree(opts.release_agent);
...@@ -1586,16 +1580,16 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type, ...@@ -1586,16 +1580,16 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
dentry = kernfs_mount(fs_type, flags, root->kf_root); dentry = kernfs_mount(fs_type, flags, root->kf_root);
if (IS_ERR(dentry)) if (IS_ERR(dentry))
cgroup_put(&root->top_cgroup); cgroup_put(&root->cgrp);
return dentry; return dentry;
} }
static void cgroup_kill_sb(struct super_block *sb) static void cgroup_kill_sb(struct super_block *sb)
{ {
struct kernfs_root *kf_root = kernfs_root_from_sb(sb); struct kernfs_root *kf_root = kernfs_root_from_sb(sb);
struct cgroupfs_root *root = cgroup_root_from_kf(kf_root); struct cgroup_root *root = cgroup_root_from_kf(kf_root);
cgroup_put(&root->top_cgroup); cgroup_put(&root->cgrp);
kernfs_kill_sb(sb); kernfs_kill_sb(sb);
} }
...@@ -1622,7 +1616,7 @@ static struct kobject *cgroup_kobj; ...@@ -1622,7 +1616,7 @@ static struct kobject *cgroup_kobj;
*/ */
char *task_cgroup_path(struct task_struct *task, char *buf, size_t buflen) char *task_cgroup_path(struct task_struct *task, char *buf, size_t buflen)
{ {
struct cgroupfs_root *root; struct cgroup_root *root;
struct cgroup *cgrp; struct cgroup *cgrp;
int hierarchy_id = 1; int hierarchy_id = 1;
char *path = NULL; char *path = NULL;
...@@ -2112,14 +2106,14 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup) ...@@ -2112,14 +2106,14 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup)
*/ */
int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk) int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk)
{ {
struct cgroupfs_root *root; struct cgroup_root *root;
int retval = 0; int retval = 0;
mutex_lock(&cgroup_mutex); mutex_lock(&cgroup_mutex);
for_each_root(root) { for_each_root(root) {
struct cgroup *from_cgrp; struct cgroup *from_cgrp;
if (root == &cgroup_dummy_root) if (root == &cgrp_dfl_root)
continue; continue;
down_read(&css_set_rwsem); down_read(&css_set_rwsem);
...@@ -2151,7 +2145,7 @@ static int cgroup_procs_write(struct cgroup_subsys_state *css, ...@@ -2151,7 +2145,7 @@ static int cgroup_procs_write(struct cgroup_subsys_state *css,
static int cgroup_release_agent_write(struct cgroup_subsys_state *css, static int cgroup_release_agent_write(struct cgroup_subsys_state *css,
struct cftype *cft, const char *buffer) struct cftype *cft, const char *buffer)
{ {
struct cgroupfs_root *root = css->cgroup->root; struct cgroup_root *root = css->cgroup->root;
BUILD_BUG_ON(sizeof(root->release_agent_path) < PATH_MAX); BUILD_BUG_ON(sizeof(root->release_agent_path) < PATH_MAX);
if (!cgroup_lock_live_group(css->cgroup)) if (!cgroup_lock_live_group(css->cgroup))
...@@ -2362,14 +2356,14 @@ static int cgroup_apply_cftypes(struct cftype *cfts, bool is_add) ...@@ -2362,14 +2356,14 @@ static int cgroup_apply_cftypes(struct cftype *cfts, bool is_add)
{ {
LIST_HEAD(pending); LIST_HEAD(pending);
struct cgroup_subsys *ss = cfts[0].ss; struct cgroup_subsys *ss = cfts[0].ss;
struct cgroup *root = &ss->root->top_cgroup; struct cgroup *root = &ss->root->cgrp;
struct cgroup_subsys_state *css; struct cgroup_subsys_state *css;
int ret = 0; int ret = 0;
lockdep_assert_held(&cgroup_tree_mutex); lockdep_assert_held(&cgroup_tree_mutex);
/* don't bother if @ss isn't attached */ /* don't bother if @ss isn't attached */
if (ss->root == &cgroup_dummy_root) if (ss->root == &cgrp_dfl_root)
return 0; return 0;
/* add/rm files for all cgroups created before */ /* add/rm files for all cgroups created before */
...@@ -3623,7 +3617,7 @@ static long cgroup_create(struct cgroup *parent, const char *name, ...@@ -3623,7 +3617,7 @@ static long cgroup_create(struct cgroup *parent, const char *name,
umode_t mode) umode_t mode)
{ {
struct cgroup *cgrp; struct cgroup *cgrp;
struct cgroupfs_root *root = parent->root; struct cgroup_root *root = parent->root;
int ssid, err; int ssid, err;
struct cgroup_subsys *ss; struct cgroup_subsys *ss;
struct kernfs_node *kn; struct kernfs_node *kn;
...@@ -3702,7 +3696,7 @@ static long cgroup_create(struct cgroup *parent, const char *name, ...@@ -3702,7 +3696,7 @@ static long cgroup_create(struct cgroup *parent, const char *name,
/* let's create and online css's */ /* let's create and online css's */
for_each_subsys(ss, ssid) { for_each_subsys(ss, ssid) {
if (root->top_cgroup.subsys_mask & (1 << ssid)) { if (root->cgrp.subsys_mask & (1 << ssid)) {
err = create_css(cgrp, ss); err = create_css(cgrp, ss);
if (err) if (err)
goto err_destroy; goto err_destroy;
...@@ -4031,17 +4025,17 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss) ...@@ -4031,17 +4025,17 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss)
INIT_LIST_HEAD(&ss->cfts); INIT_LIST_HEAD(&ss->cfts);
/* Create the top cgroup state for this subsystem */ /* Create the root cgroup state for this subsystem */
ss->root = &cgroup_dummy_root; ss->root = &cgrp_dfl_root;
css = ss->css_alloc(cgroup_css(cgroup_dummy_top, ss)); css = ss->css_alloc(cgroup_css(&cgrp_dfl_root.cgrp, ss));
/* We don't handle early failures gracefully */ /* We don't handle early failures gracefully */
BUG_ON(IS_ERR(css)); BUG_ON(IS_ERR(css));
init_css(css, ss, cgroup_dummy_top); init_css(css, ss, &cgrp_dfl_root.cgrp);
/* Update the init_css_set to contain a subsys /* Update the init_css_set to contain a subsys
* pointer to this state - since the subsystem is * pointer to this state - since the subsystem is
* newly registered, all tasks and hence the * newly registered, all tasks and hence the
* init_css_set is in the subsystem's top cgroup. */ * init_css_set is in the subsystem's root cgroup. */
init_css_set.subsys[ss->id] = css; init_css_set.subsys[ss->id] = css;
need_forkexit_callback |= ss->fork || ss->exit; need_forkexit_callback |= ss->fork || ss->exit;
...@@ -4053,7 +4047,7 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss) ...@@ -4053,7 +4047,7 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss)
BUG_ON(online_css(css)); BUG_ON(online_css(css));
cgroup_dummy_root.top_cgroup.subsys_mask |= 1 << ss->id; cgrp_dfl_root.cgrp.subsys_mask |= 1 << ss->id;
mutex_unlock(&cgroup_mutex); mutex_unlock(&cgroup_mutex);
mutex_unlock(&cgroup_tree_mutex); mutex_unlock(&cgroup_tree_mutex);
...@@ -4071,7 +4065,7 @@ int __init cgroup_init_early(void) ...@@ -4071,7 +4065,7 @@ int __init cgroup_init_early(void)
struct cgroup_subsys *ss; struct cgroup_subsys *ss;
int i; int i;
init_cgroup_root(&cgroup_dummy_root, &opts); init_cgroup_root(&cgrp_dfl_root, &opts);
RCU_INIT_POINTER(init_task.cgroups, &init_css_set); RCU_INIT_POINTER(init_task.cgroups, &init_css_set);
for_each_subsys(ss, i) { for_each_subsys(ss, i) {
...@@ -4112,7 +4106,7 @@ int __init cgroup_init(void) ...@@ -4112,7 +4106,7 @@ int __init cgroup_init(void)
key = css_set_hash(init_css_set.subsys); key = css_set_hash(init_css_set.subsys);
hash_add(css_set_table, &init_css_set.hlist, key); hash_add(css_set_table, &init_css_set.hlist, key);
BUG_ON(cgroup_setup_root(&cgroup_dummy_root, 0)); BUG_ON(cgroup_setup_root(&cgrp_dfl_root, 0));
mutex_unlock(&cgroup_mutex); mutex_unlock(&cgroup_mutex);
mutex_unlock(&cgroup_tree_mutex); mutex_unlock(&cgroup_tree_mutex);
...@@ -4181,7 +4175,7 @@ int proc_cgroup_show(struct seq_file *m, void *v) ...@@ -4181,7 +4175,7 @@ int proc_cgroup_show(struct seq_file *m, void *v)
struct task_struct *tsk; struct task_struct *tsk;
char *buf, *path; char *buf, *path;
int retval; int retval;
struct cgroupfs_root *root; struct cgroup_root *root;
retval = -ENOMEM; retval = -ENOMEM;
buf = kmalloc(PATH_MAX, GFP_KERNEL); buf = kmalloc(PATH_MAX, GFP_KERNEL);
...@@ -4204,12 +4198,12 @@ int proc_cgroup_show(struct seq_file *m, void *v) ...@@ -4204,12 +4198,12 @@ int proc_cgroup_show(struct seq_file *m, void *v)
struct cgroup *cgrp; struct cgroup *cgrp;
int ssid, count = 0; int ssid, count = 0;
if (root == &cgroup_dummy_root) if (root == &cgrp_dfl_root)
continue; continue;
seq_printf(m, "%d:", root->hierarchy_id); seq_printf(m, "%d:", root->hierarchy_id);
for_each_subsys(ss, ssid) for_each_subsys(ss, ssid)
if (root->top_cgroup.subsys_mask & (1 << ssid)) if (root->cgrp.subsys_mask & (1 << ssid))
seq_printf(m, "%s%s", count++ ? "," : "", ss->name); seq_printf(m, "%s%s", count++ ? "," : "", ss->name);
if (strlen(root->name)) if (strlen(root->name))
seq_printf(m, "%sname=%s", count ? "," : "", seq_printf(m, "%sname=%s", count ? "," : "",
...@@ -4639,7 +4633,7 @@ static int current_css_set_cg_links_read(struct seq_file *seq, void *v) ...@@ -4639,7 +4633,7 @@ static int current_css_set_cg_links_read(struct seq_file *seq, void *v)
struct cgroup *c = link->cgrp; struct cgroup *c = link->cgrp;
const char *name = "?"; const char *name = "?";
if (c != cgroup_dummy_top) { if (c != &cgrp_dfl_root.cgrp) {
cgroup_name(c, name_buf, NAME_MAX + 1); cgroup_name(c, name_buf, NAME_MAX + 1);
name = name_buf; name = name_buf;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment