Merge branch 'for-3.14-fixes' into for-3.15
authorTejun Heo <tj@kernel.org>
Sat, 8 Feb 2014 15:37:14 +0000 (10:37 -0500)
committerTejun Heo <tj@kernel.org>
Sat, 8 Feb 2014 15:37:14 +0000 (10:37 -0500)
Pending kernfs conversion depends on fixes in for-3.14-fixes.  Pull it
into for-3.15.

Signed-off-by: Tejun Heo <tj@kernel.org>
22 files changed:
block/blk-cgroup.c
block/blk-cgroup.h
fs/bio.c
include/linux/cgroup.h
include/linux/cgroup_subsys.h
include/linux/hugetlb_cgroup.h
include/linux/memcontrol.h
include/net/cls_cgroup.h
include/net/netprio_cgroup.h
kernel/cgroup.c
kernel/cgroup_freezer.c
kernel/cpuset.c
kernel/events/core.c
kernel/sched/core.c
kernel/sched/cpuacct.c
mm/hugetlb_cgroup.c
mm/memcontrol.c
net/Kconfig
net/core/netclassid_cgroup.c
net/core/netprio_cgroup.c
net/ipv4/tcp_memcontrol.c
security/device_cgroup.c

index 4e491d9b529255476939b8608d91718c40140059..1cef07cf9c213cd5810940a9a0b60d3ddbdc3d9c 100644 (file)
@@ -906,17 +906,14 @@ static int blkcg_can_attach(struct cgroup_subsys_state *css,
        return ret;
 }
 
-struct cgroup_subsys blkio_subsys = {
-       .name = "blkio",
+struct cgroup_subsys blkio_cgrp_subsys = {
        .css_alloc = blkcg_css_alloc,
        .css_offline = blkcg_css_offline,
        .css_free = blkcg_css_free,
        .can_attach = blkcg_can_attach,
-       .subsys_id = blkio_subsys_id,
        .base_cftypes = blkcg_files,
-       .module = THIS_MODULE,
 };
-EXPORT_SYMBOL_GPL(blkio_subsys);
+EXPORT_SYMBOL_GPL(blkio_cgrp_subsys);
 
 /**
  * blkcg_activate_policy - activate a blkcg policy on a request_queue
@@ -1106,7 +1103,7 @@ int blkcg_policy_register(struct blkcg_policy *pol)
 
        /* everything is in place, add intf files for the new policy */
        if (pol->cftypes)
-               WARN_ON(cgroup_add_cftypes(&blkio_subsys, pol->cftypes));
+               WARN_ON(cgroup_add_cftypes(&blkio_cgrp_subsys, pol->cftypes));
        ret = 0;
 out_unlock:
        mutex_unlock(&blkcg_pol_mutex);
index 86154eab95239fdd6300ddc665f03650b80f1a5b..453b528c8e194b6b28e46347d0c0ad4165bb67c3 100644 (file)
@@ -186,7 +186,7 @@ static inline struct blkcg *css_to_blkcg(struct cgroup_subsys_state *css)
 
 static inline struct blkcg *task_blkcg(struct task_struct *tsk)
 {
-       return css_to_blkcg(task_css(tsk, blkio_subsys_id));
+       return css_to_blkcg(task_css(tsk, blkio_cgrp_id));
 }
 
 static inline struct blkcg *bio_blkcg(struct bio *bio)
index 75c49a38223969c1f7256868cb3b09fc7d3bd286..4872102b839e5725f3d7277fdc8c11698f617640 100644 (file)
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -1965,7 +1965,7 @@ int bio_associate_current(struct bio *bio)
 
        /* associate blkcg if exists */
        rcu_read_lock();
-       css = task_css(current, blkio_subsys_id);
+       css = task_css(current, blkio_cgrp_id);
        if (css && css_tryget(css))
                bio->bi_css = css;
        rcu_read_unlock();
index 5c097596104b80535a0a00bdd45b4a2441fac889..198c7fcd727e5d9690d957a5f7fba80b900318c6 100644 (file)
@@ -37,28 +37,13 @@ extern void cgroup_post_fork(struct task_struct *p);
 extern void cgroup_exit(struct task_struct *p, int run_callbacks);
 extern int cgroupstats_build(struct cgroupstats *stats,
                                struct dentry *dentry);
-extern int cgroup_load_subsys(struct cgroup_subsys *ss);
-extern void cgroup_unload_subsys(struct cgroup_subsys *ss);
 
 extern int proc_cgroup_show(struct seq_file *, void *);
 
-/*
- * Define the enumeration of all cgroup subsystems.
- *
- * We define ids for builtin subsystems and then modular ones.
- */
-#define SUBSYS(_x) _x ## _subsys_id,
+/* define the enumeration of all cgroup subsystems */
+#define SUBSYS(_x) _x ## _cgrp_id,
 enum cgroup_subsys_id {
-#define IS_SUBSYS_ENABLED(option) IS_BUILTIN(option)
-#include <linux/cgroup_subsys.h>
-#undef IS_SUBSYS_ENABLED
-       CGROUP_BUILTIN_SUBSYS_COUNT,
-
-       __CGROUP_SUBSYS_TEMP_PLACEHOLDER = CGROUP_BUILTIN_SUBSYS_COUNT - 1,
-
-#define IS_SUBSYS_ENABLED(option) IS_MODULE(option)
 #include <linux/cgroup_subsys.h>
-#undef IS_SUBSYS_ENABLED
        CGROUP_SUBSYS_COUNT,
 };
 #undef SUBSYS
@@ -370,10 +355,9 @@ struct css_set {
        struct list_head cgrp_links;
 
        /*
-        * Set of subsystem states, one for each subsystem. This array
-        * is immutable after creation apart from the init_css_set
-        * during subsystem registration (at boot time) and modular subsystem
-        * loading/unloading.
+        * Set of subsystem states, one for each subsystem. This array is
+        * immutable after creation apart from the init_css_set during
+        * subsystem registration (at boot time).
         */
        struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
 
@@ -564,7 +548,7 @@ int cgroup_taskset_size(struct cgroup_taskset *tset);
             (task) = cgroup_taskset_next((tset)))                      \
                if (!(skip_css) ||                                      \
                    cgroup_taskset_cur_css((tset),                      \
-                       (skip_css)->ss->subsys_id) != (skip_css))
+                       (skip_css)->ss->id) != (skip_css))
 
 /*
  * Control Group subsystem type.
@@ -589,7 +573,6 @@ struct cgroup_subsys {
                     struct task_struct *task);
        void (*bind)(struct cgroup_subsys_state *root_css);
 
-       int subsys_id;
        int disabled;
        int early_init;
 
@@ -608,6 +591,8 @@ struct cgroup_subsys {
        bool broken_hierarchy;
        bool warned_broken_hierarchy;
 
+       /* the following two fields are initialized automtically during boot */
+       int id;
 #define MAX_CGROUP_TYPE_NAMELEN 32
        const char *name;
 
@@ -620,15 +605,10 @@ struct cgroup_subsys {
        /* base cftypes, automatically [de]registered with subsys itself */
        struct cftype *base_cftypes;
        struct cftype_set base_cftset;
-
-       /* should be defined only by modular subsystems */
-       struct module *module;
 };
 
-#define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys;
-#define IS_SUBSYS_ENABLED(option) IS_BUILTIN(option)
+#define SUBSYS(_x) extern struct cgroup_subsys _x ## _cgrp_subsys;
 #include <linux/cgroup_subsys.h>
-#undef IS_SUBSYS_ENABLED
 #undef SUBSYS
 
 /**
index 7b99d717411d2b5ef3c14c0b2668a9c3bfe036e2..768fe44e19f0da66b9dbac8054e151a2e4b6a9d3 100644 (file)
@@ -3,51 +3,51 @@
  *
  * DO NOT ADD ANY SUBSYSTEM WITHOUT EXPLICIT ACKS FROM CGROUP MAINTAINERS.
  */
-#if IS_SUBSYS_ENABLED(CONFIG_CPUSETS)
+#if IS_ENABLED(CONFIG_CPUSETS)
 SUBSYS(cpuset)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_DEBUG)
+#if IS_ENABLED(CONFIG_CGROUP_DEBUG)
 SUBSYS(debug)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_SCHED)
-SUBSYS(cpu_cgroup)
+#if IS_ENABLED(CONFIG_CGROUP_SCHED)
+SUBSYS(cpu)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_CPUACCT)
+#if IS_ENABLED(CONFIG_CGROUP_CPUACCT)
 SUBSYS(cpuacct)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_MEMCG)
-SUBSYS(mem_cgroup)
+#if IS_ENABLED(CONFIG_MEMCG)
+SUBSYS(memory)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_DEVICE)
+#if IS_ENABLED(CONFIG_CGROUP_DEVICE)
 SUBSYS(devices)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_FREEZER)
+#if IS_ENABLED(CONFIG_CGROUP_FREEZER)
 SUBSYS(freezer)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_NET_CLASSID)
+#if IS_ENABLED(CONFIG_CGROUP_NET_CLASSID)
 SUBSYS(net_cls)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_BLK_CGROUP)
+#if IS_ENABLED(CONFIG_BLK_CGROUP)
 SUBSYS(blkio)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_PERF)
-SUBSYS(perf)
+#if IS_ENABLED(CONFIG_CGROUP_PERF)
+SUBSYS(perf_event)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_NET_PRIO)
+#if IS_ENABLED(CONFIG_CGROUP_NET_PRIO)
 SUBSYS(net_prio)
 #endif
 
-#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_HUGETLB)
+#if IS_ENABLED(CONFIG_CGROUP_HUGETLB)
 SUBSYS(hugetlb)
 #endif
 /*
index 787bba3bf5528e6679cea598c2c212c5fb108ea2..0129f89cf98de1b506452b7df8251ce0bef4f6b9 100644 (file)
@@ -49,7 +49,7 @@ int set_hugetlb_cgroup(struct page *page, struct hugetlb_cgroup *h_cg)
 
 static inline bool hugetlb_cgroup_disabled(void)
 {
-       if (hugetlb_subsys.disabled)
+       if (hugetlb_cgrp_subsys.disabled)
                return true;
        return false;
 }
index abd0113b66203ca2713c848516e5f3a7cef90718..eccfb4a4b37928be40629c259f709e90f9f15620 100644 (file)
@@ -162,7 +162,7 @@ extern int do_swap_account;
 
 static inline bool mem_cgroup_disabled(void)
 {
-       if (mem_cgroup_subsys.disabled)
+       if (memory_cgrp_subsys.disabled)
                return true;
        return false;
 }
index 9cf2d5ef38d967ad7d67202bbd82f3bd933a31dd..c15d39456e146196b24bafed159099baa57e03e9 100644 (file)
@@ -34,7 +34,7 @@ static inline u32 task_cls_classid(struct task_struct *p)
                return 0;
 
        rcu_read_lock();
-       classid = container_of(task_css(p, net_cls_subsys_id),
+       classid = container_of(task_css(p, net_cls_cgrp_id),
                               struct cgroup_cls_state, css)->classid;
        rcu_read_unlock();
 
index dafc09f0fdbc86f8b87180cbee2e733694b89085..f2a9597ff53c089cb3aa4a810e6286355c9f194c 100644 (file)
@@ -27,32 +27,17 @@ struct netprio_map {
 
 void sock_update_netprioidx(struct sock *sk);
 
-#if IS_BUILTIN(CONFIG_CGROUP_NET_PRIO)
 static inline u32 task_netprioidx(struct task_struct *p)
 {
        struct cgroup_subsys_state *css;
        u32 idx;
 
        rcu_read_lock();
-       css = task_css(p, net_prio_subsys_id);
+       css = task_css(p, net_prio_cgrp_id);
        idx = css->cgroup->id;
        rcu_read_unlock();
        return idx;
 }
-#elif IS_MODULE(CONFIG_CGROUP_NET_PRIO)
-static inline u32 task_netprioidx(struct task_struct *p)
-{
-       struct cgroup_subsys_state *css;
-       u32 idx = 0;
-
-       rcu_read_lock();
-       css = task_css(p, net_prio_subsys_id);
-       if (css)
-               idx = css->cgroup->id;
-       rcu_read_unlock();
-       return idx;
-}
-#endif
 #else /* !CONFIG_CGROUP_NET_PRIO */
 static inline u32 task_netprioidx(struct task_struct *p)
 {
index 3edf7163b84fb08eb1cf85a5388706c0d7f0ca41..f5bbe58853644a0e5d30991a71347d48839ee208 100644 (file)
@@ -47,7 +47,6 @@
 #include <linux/string.h>
 #include <linux/sort.h>
 #include <linux/kmod.h>
-#include <linux/module.h>
 #include <linux/delayacct.h>
 #include <linux/cgroupstats.h>
 #include <linux/hashtable.h>
 /*
  * cgroup_mutex is the master lock.  Any modification to cgroup or its
  * hierarchy must be performed while holding it.
- *
- * cgroup_root_mutex nests inside cgroup_mutex and should be held to modify
- * cgroupfs_root of any cgroup hierarchy - subsys list, flags,
- * release_agent_path and so on.  Modifying requires both cgroup_mutex and
- * cgroup_root_mutex.  Readers can acquire either of the two.  This is to
- * break the following locking order cycle.
- *
- *  A. cgroup_mutex -> cred_guard_mutex -> s_type->i_mutex_key -> namespace_sem
- *  B. namespace_sem -> cgroup_mutex
- *
- * B happens only through cgroup_show_options() and using cgroup_root_mutex
- * breaks it.
  */
 #ifdef CONFIG_PROVE_RCU
 DEFINE_MUTEX(cgroup_mutex);
@@ -91,21 +78,17 @@ EXPORT_SYMBOL_GPL(cgroup_mutex);    /* only for lockdep */
 static DEFINE_MUTEX(cgroup_mutex);
 #endif
 
-static DEFINE_MUTEX(cgroup_root_mutex);
+/*
+ * Protects cgroup_subsys->release_agent_path.  Modifying it also requires
+ * cgroup_mutex.  Reading requires either cgroup_mutex or this spinlock.
+ */
+static DEFINE_SPINLOCK(release_agent_path_lock);
 
 #define cgroup_assert_mutex_or_rcu_locked()                            \
        rcu_lockdep_assert(rcu_read_lock_held() ||                      \
                           lockdep_is_held(&cgroup_mutex),              \
                           "cgroup_mutex or RCU read lock required");
 
-#ifdef CONFIG_LOCKDEP
-#define cgroup_assert_mutex_or_root_locked()                           \
-       WARN_ON_ONCE(debug_locks && (!lockdep_is_held(&cgroup_mutex) && \
-                                    !lockdep_is_held(&cgroup_root_mutex)))
-#else
-#define cgroup_assert_mutex_or_root_locked()   do { } while (0)
-#endif
-
 /*
  * cgroup destruction makes heavy use of work items and there can be a lot
  * of concurrent destructions.  Use a separate workqueue so that cgroup
@@ -120,17 +103,19 @@ static struct workqueue_struct *cgroup_destroy_wq;
  */
 static struct workqueue_struct *cgroup_pidlist_destroy_wq;
 
-/*
- * Generate an array of cgroup subsystem pointers. At boot time, this is
- * populated with the built in subsystems, and modular subsystems are
- * registered after that. The mutable section of this array is protected by
- * cgroup_mutex.
- */
-#define SUBSYS(_x) [_x ## _subsys_id] = &_x ## _subsys,
-#define IS_SUBSYS_ENABLED(option) IS_BUILTIN(option)
-static struct cgroup_subsys *cgroup_subsys[CGROUP_SUBSYS_COUNT] = {
+/* generate an array of cgroup subsystem pointers */
+#define SUBSYS(_x) [_x ## _cgrp_id] = &_x ## _cgrp_subsys,
+static struct cgroup_subsys *cgroup_subsys[] = {
+#include <linux/cgroup_subsys.h>
+};
+#undef SUBSYS
+
+/* array of cgroup subsystem names */
+#define SUBSYS(_x) [_x ## _cgrp_id] = #_x,
+static const char *cgroup_subsys_name[] = {
 #include <linux/cgroup_subsys.h>
 };
+#undef SUBSYS
 
 /*
  * The dummy hierarchy, reserved for the subsystems that are otherwise
@@ -147,11 +132,7 @@ static struct cgroup * const cgroup_dummy_top = &cgroup_dummy_root.top_cgroup;
 static LIST_HEAD(cgroup_roots);
 static int cgroup_root_count;
 
-/*
- * Hierarchy ID allocation and mapping.  It follows the same exclusion
- * rules as other root ops - both cgroup_mutex and cgroup_root_mutex for
- * writes, either for reads.
- */
+/* hierarchy ID allocation and mapping, protected by cgroup_mutex */
 static DEFINE_IDR(cgroup_hierarchy_idr);
 
 static struct cgroup_name root_cgroup_name = { .name = "/" };
@@ -197,7 +178,7 @@ static struct cgroup_subsys_state *cgroup_css(struct cgroup *cgrp,
                                              struct cgroup_subsys *ss)
 {
        if (ss)
-               return rcu_dereference_check(cgrp->subsys[ss->subsys_id],
+               return rcu_dereference_check(cgrp->subsys[ss->id],
                                             lockdep_is_held(&cgroup_mutex));
        else
                return &cgrp->dummy_css;
@@ -258,30 +239,13 @@ static int notify_on_release(const struct cgroup *cgrp)
                else
 
 /**
- * for_each_subsys - iterate all loaded cgroup subsystems
+ * for_each_subsys - iterate all enabled cgroup subsystems
  * @ss: the iteration cursor
  * @ssid: the index of @ss, CGROUP_SUBSYS_COUNT after reaching the end
- *
- * Iterates through all loaded subsystems.  Should be called under
- * cgroup_mutex or cgroup_root_mutex.
  */
 #define for_each_subsys(ss, ssid)                                      \
-       for (({ cgroup_assert_mutex_or_root_locked(); (ssid) = 0; });   \
-            (ssid) < CGROUP_SUBSYS_COUNT; (ssid)++)                    \
-               if (!((ss) = cgroup_subsys[(ssid)])) { }                \
-               else
-
-/**
- * for_each_builtin_subsys - iterate all built-in cgroup subsystems
- * @ss: the iteration cursor
- * @i: the index of @ss, CGROUP_BUILTIN_SUBSYS_COUNT after reaching the end
- *
- * Bulit-in subsystems are always present and iteration itself doesn't
- * require any synchronization.
- */
-#define for_each_builtin_subsys(ss, i)                                 \
-       for ((i) = 0; (i) < CGROUP_BUILTIN_SUBSYS_COUNT &&              \
-            (((ss) = cgroup_subsys[i]) || true); (i)++)
+       for ((ssid) = 0; (ssid) < CGROUP_SUBSYS_COUNT &&                \
+            (((ss) = cgroup_subsys[ssid]) || true); (ssid)++)
 
 /* iterate across the active hierarchies */
 #define for_each_active_root(root)                                     \
@@ -975,50 +939,23 @@ static void cgroup_d_remove_dir(struct dentry *dentry)
        remove_dir(dentry);
 }
 
-/*
- * Call with cgroup_mutex held. Drops reference counts on modules, including
- * any duplicate ones that parse_cgroupfs_options took. If this function
- * returns an error, no reference counts are touched.
- */
 static int rebind_subsystems(struct cgroupfs_root *root,
                             unsigned long added_mask, unsigned removed_mask)
 {
        struct cgroup *cgrp = &root->top_cgroup;
        struct cgroup_subsys *ss;
-       unsigned long pinned = 0;
        int i, ret;
 
        BUG_ON(!mutex_is_locked(&cgroup_mutex));
-       BUG_ON(!mutex_is_locked(&cgroup_root_mutex));
 
        /* Check that any added subsystems are currently free */
-       for_each_subsys(ss, i) {
-               if (!(added_mask & (1 << i)))
-                       continue;
-
-               /* is the subsystem mounted elsewhere? */
-               if (ss->root != &cgroup_dummy_root) {
-                       ret = -EBUSY;
-                       goto out_put;
-               }
-
-               /* pin the module */
-               if (!try_module_get(ss->module)) {
-                       ret = -ENOENT;
-                       goto out_put;
-               }
-               pinned |= 1 << i;
-       }
-
-       /* subsys could be missing if unloaded between parsing and here */
-       if (added_mask != pinned) {
-               ret = -ENOENT;
-               goto out_put;
-       }
+       for_each_subsys(ss, i)
+               if ((added_mask & (1 << i)) && ss->root != &cgroup_dummy_root)
+                       return -EBUSY;
 
        ret = cgroup_populate_dir(cgrp, added_mask);
        if (ret)
-               goto out_put;
+               return ret;
 
        /*
         * Nothing can fail from this point on.  Remove files for the
@@ -1057,9 +994,6 @@ static int rebind_subsystems(struct cgroupfs_root *root,
                        RCU_INIT_POINTER(cgrp->subsys[i], NULL);
 
                        cgroup_subsys[i]->root = &cgroup_dummy_root;
-
-                       /* subsystem is now free - drop reference on module */
-                       module_put(ss->module);
                        root->subsys_mask &= ~bit;
                }
        }
@@ -1071,12 +1005,6 @@ static int rebind_subsystems(struct cgroupfs_root *root,
        root->flags |= CGRP_ROOT_SUBSYS_BOUND;
 
        return 0;
-
-out_put:
-       for_each_subsys(ss, i)
-               if (pinned & (1 << i))
-                       module_put(ss->module);
-       return ret;
 }
 
 static int cgroup_show_options(struct seq_file *seq, struct dentry *dentry)
@@ -1085,7 +1013,6 @@ static int cgroup_show_options(struct seq_file *seq, struct dentry *dentry)
        struct cgroup_subsys *ss;
        int ssid;
 
-       mutex_lock(&cgroup_root_mutex);
        for_each_subsys(ss, ssid)
                if (root->subsys_mask & (1 << ssid))
                        seq_printf(seq, ",%s", ss->name);
@@ -1095,13 +1022,16 @@ static int cgroup_show_options(struct seq_file *seq, struct dentry *dentry)
                seq_puts(seq, ",noprefix");
        if (root->flags & CGRP_ROOT_XATTR)
                seq_puts(seq, ",xattr");
+
+       spin_lock(&release_agent_path_lock);
        if (strlen(root->release_agent_path))
                seq_printf(seq, ",release_agent=%s", root->release_agent_path);
+       spin_unlock(&release_agent_path_lock);
+
        if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->top_cgroup.flags))
                seq_puts(seq, ",clone_children");
        if (strlen(root->name))
                seq_printf(seq, ",name=%s", root->name);
-       mutex_unlock(&cgroup_root_mutex);
        return 0;
 }
 
@@ -1135,7 +1065,7 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts)
        BUG_ON(!mutex_is_locked(&cgroup_mutex));
 
 #ifdef CONFIG_CPUSETS
-       mask = ~(1UL << cpuset_subsys_id);
+       mask = ~(1UL << cpuset_cgrp_id);
 #endif
 
        memset(opts, 0, sizeof(*opts));
@@ -1289,7 +1219,6 @@ static int cgroup_remount(struct super_block *sb, int *flags, char *data)
 
        mutex_lock(&cgrp->dentry->d_inode->i_mutex);
        mutex_lock(&cgroup_mutex);
-       mutex_lock(&cgroup_root_mutex);
 
        /* See what subsystems are wanted */
        ret = parse_cgroupfs_options(data, &opts);
@@ -1323,12 +1252,14 @@ static int cgroup_remount(struct super_block *sb, int *flags, char *data)
        if (ret)
                goto out_unlock;
 
-       if (opts.release_agent)
+       if (opts.release_agent) {
+               spin_lock(&release_agent_path_lock);
                strcpy(root->release_agent_path, opts.release_agent);
+               spin_unlock(&release_agent_path_lock);
+       }
  out_unlock:
        kfree(opts.release_agent);
        kfree(opts.name);
-       mutex_unlock(&cgroup_root_mutex);
        mutex_unlock(&cgroup_mutex);
        mutex_unlock(&cgrp->dentry->d_inode->i_mutex);
        return ret;
@@ -1371,7 +1302,6 @@ static int cgroup_init_root_id(struct cgroupfs_root *root, int start, int end)
        int id;
 
        lockdep_assert_held(&cgroup_mutex);
-       lockdep_assert_held(&cgroup_root_mutex);
 
        id = idr_alloc_cyclic(&cgroup_hierarchy_idr, root, start, end,
                              GFP_KERNEL);
@@ -1385,7 +1315,6 @@ static int cgroup_init_root_id(struct cgroupfs_root *root, int start, int end)
 static void cgroup_exit_root_id(struct cgroupfs_root *root)
 {
        lockdep_assert_held(&cgroup_mutex);
-       lockdep_assert_held(&cgroup_root_mutex);
 
        if (root->hierarchy_id) {
                idr_remove(&cgroup_hierarchy_idr, root->hierarchy_id);
@@ -1564,7 +1493,6 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
 
                mutex_lock(&inode->i_mutex);
                mutex_lock(&cgroup_mutex);
-               mutex_lock(&cgroup_root_mutex);
 
                ret = idr_alloc(&root->cgroup_idr, root_cgrp, 0, 1, GFP_KERNEL);
                if (ret < 0)
@@ -1637,7 +1565,6 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
                BUG_ON(!list_empty(&root_cgrp->children));
                BUG_ON(root->number_of_cgroups != 1);
 
-               mutex_unlock(&cgroup_root_mutex);
                mutex_unlock(&cgroup_mutex);
                mutex_unlock(&inode->i_mutex);
        } else {
@@ -1668,7 +1595,6 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
        revert_creds(cred);
  unlock_drop:
        cgroup_exit_root_id(root);
-       mutex_unlock(&cgroup_root_mutex);
        mutex_unlock(&cgroup_mutex);
        mutex_unlock(&inode->i_mutex);
  drop_new_super:
@@ -1693,7 +1619,6 @@ static void cgroup_kill_sb(struct super_block *sb)
 
        mutex_lock(&cgrp->dentry->d_inode->i_mutex);
        mutex_lock(&cgroup_mutex);
-       mutex_lock(&cgroup_root_mutex);
 
        /* Rebind all subsystems back to the default hierarchy */
        if (root->flags & CGRP_ROOT_SUBSYS_BOUND) {
@@ -1722,7 +1647,6 @@ static void cgroup_kill_sb(struct super_block *sb)
 
        cgroup_exit_root_id(root);
 
-       mutex_unlock(&cgroup_root_mutex);
        mutex_unlock(&cgroup_mutex);
        mutex_unlock(&cgrp->dentry->d_inode->i_mutex);
 
@@ -2233,9 +2157,9 @@ static int cgroup_release_agent_write(struct cgroup_subsys_state *css,
                return -EINVAL;
        if (!cgroup_lock_live_group(css->cgroup))
                return -ENODEV;
-       mutex_lock(&cgroup_root_mutex);
+       spin_lock(&release_agent_path_lock);
        strcpy(css->cgroup->root->release_agent_path, buffer);
-       mutex_unlock(&cgroup_root_mutex);
+       spin_unlock(&release_agent_path_lock);
        mutex_unlock(&cgroup_mutex);
        return 0;
 }
@@ -4026,7 +3950,7 @@ static void css_release(struct percpu_ref *ref)
        struct cgroup_subsys_state *css =
                container_of(ref, struct cgroup_subsys_state, refcnt);
 
-       rcu_assign_pointer(css->cgroup->subsys[css->ss->subsys_id], NULL);
+       rcu_assign_pointer(css->cgroup->subsys[css->ss->id], NULL);
        call_rcu(&css->rcu_head, css_free_rcu_fn);
 }
 
@@ -4058,7 +3982,7 @@ static int online_css(struct cgroup_subsys_state *css)
        if (!ret) {
                css->flags |= CSS_ONLINE;
                css->cgroup->nr_css++;
-               rcu_assign_pointer(css->cgroup->subsys[ss->subsys_id], css);
+               rcu_assign_pointer(css->cgroup->subsys[ss->id], css);
        }
        return ret;
 }
@@ -4078,7 +4002,7 @@ static void offline_css(struct cgroup_subsys_state *css)
 
        css->flags &= ~CSS_ONLINE;
        css->cgroup->nr_css--;
-       RCU_INIT_POINTER(css->cgroup->subsys[ss->subsys_id], css);
+       RCU_INIT_POINTER(css->cgroup->subsys[ss->id], css);
 }
 
 /**
@@ -4109,7 +4033,7 @@ static int create_css(struct cgroup *cgrp, struct cgroup_subsys *ss)
 
        init_css(css, ss, cgrp);
 
-       err = cgroup_populate_dir(cgrp, 1 << ss->subsys_id);
+       err = cgroup_populate_dir(cgrp, 1 << ss->id);
        if (err)
                goto err_free;
 
@@ -4340,7 +4264,7 @@ static void css_killed_ref_fn(struct percpu_ref *ref)
  */
 static void kill_css(struct cgroup_subsys_state *css)
 {
-       cgroup_clear_dir(css->cgroup, 1 << css->ss->subsys_id);
+       cgroup_clear_dir(css->cgroup, 1 << css->ss->id);
 
        /*
         * Killing would put the base ref, but we need to keep it alive
@@ -4503,7 +4427,7 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry)
        return ret;
 }
 
-static void __init_or_module cgroup_init_cftsets(struct cgroup_subsys *ss)
+static void __init cgroup_init_cftsets(struct cgroup_subsys *ss)
 {
        INIT_LIST_HEAD(&ss->cftsets);
 
@@ -4544,7 +4468,7 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss)
         * pointer to this state - since the subsystem is
         * newly registered, all tasks and hence the
         * init_css_set is in the subsystem's top cgroup. */
-       init_css_set.subsys[ss->subsys_id] = css;
+       init_css_set.subsys[ss->id] = css;
 
        need_forkexit_callback |= ss->fork || ss->exit;
 
@@ -4556,185 +4480,8 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss)
        BUG_ON(online_css(css));
 
        mutex_unlock(&cgroup_mutex);
-
-       /* this function shouldn't be used with modular subsystems, since they
-        * need to register a subsys_id, among other things */
-       BUG_ON(ss->module);
 }
 
-/**
- * cgroup_load_subsys: load and register a modular subsystem at runtime
- * @ss: the subsystem to load
- *
- * This function should be called in a modular subsystem's initcall. If the
- * subsystem is built as a module, it will be assigned a new subsys_id and set
- * up for use. If the subsystem is built-in anyway, work is delegated to the
- * simpler cgroup_init_subsys.
- */
-int __init_or_module cgroup_load_subsys(struct cgroup_subsys *ss)
-{
-       struct cgroup_subsys_state *css;
-       int i, ret;
-       struct hlist_node *tmp;
-       struct css_set *cset;
-       unsigned long key;
-
-       /* check name and function validity */
-       if (ss->name == NULL || strlen(ss->name) > MAX_CGROUP_TYPE_NAMELEN ||
-           ss->css_alloc == NULL || ss->css_free == NULL)
-               return -EINVAL;
-
-       /*
-        * we don't support callbacks in modular subsystems. this check is
-        * before the ss->module check for consistency; a subsystem that could
-        * be a module should still have no callbacks even if the user isn't
-        * compiling it as one.
-        */
-       if (ss->fork || ss->exit)
-               return -EINVAL;
-
-       /*
-        * an optionally modular subsystem is built-in: we want to do nothing,
-        * since cgroup_init_subsys will have already taken care of it.
-        */
-       if (ss->module == NULL) {
-               /* a sanity check */
-               BUG_ON(cgroup_subsys[ss->subsys_id] != ss);
-               return 0;
-       }
-
-       /* init base cftset */
-       cgroup_init_cftsets(ss);
-
-       mutex_lock(&cgroup_mutex);
-       mutex_lock(&cgroup_root_mutex);
-       cgroup_subsys[ss->subsys_id] = ss;
-
-       /*
-        * no ss->css_alloc seems to need anything important in the ss
-        * struct, so this can happen first (i.e. before the dummy root
-        * attachment).
-        */
-       css = ss->css_alloc(cgroup_css(cgroup_dummy_top, ss));
-       if (IS_ERR(css)) {
-               /* failure case - need to deassign the cgroup_subsys[] slot. */
-               cgroup_subsys[ss->subsys_id] = NULL;
-               mutex_unlock(&cgroup_root_mutex);
-               mutex_unlock(&cgroup_mutex);
-               return PTR_ERR(css);
-       }
-
-       ss->root = &cgroup_dummy_root;
-
-       /* our new subsystem will be attached to the dummy hierarchy. */
-       init_css(css, ss, cgroup_dummy_top);
-
-       /*
-        * Now we need to entangle the css into the existing css_sets. unlike
-        * in cgroup_init_subsys, there are now multiple css_sets, so each one
-        * will need a new pointer to it; done by iterating the css_set_table.
-        * furthermore, modifying the existing css_sets will corrupt the hash
-        * table state, so each changed css_set will need its hash recomputed.
-        * this is all done under the css_set_lock.
-        */
-       write_lock(&css_set_lock);
-       hash_for_each_safe(css_set_table, i, tmp, cset, hlist) {
-               /* skip entries that we already rehashed */
-               if (cset->subsys[ss->subsys_id])
-                       continue;
-               /* remove existing entry */
-               hash_del(&cset->hlist);
-               /* set new value */
-               cset->subsys[ss->subsys_id] = css;
-               /* recompute hash and restore entry */
-               key = css_set_hash(cset->subsys);
-               hash_add(css_set_table, &cset->hlist, key);
-       }
-       write_unlock(&css_set_lock);
-
-       ret = online_css(css);
-       if (ret) {
-               ss->css_free(css);
-               goto err_unload;
-       }
-
-       /* success! */
-       mutex_unlock(&cgroup_root_mutex);
-       mutex_unlock(&cgroup_mutex);
-       return 0;
-
-err_unload:
-       mutex_unlock(&cgroup_root_mutex);
-       mutex_unlock(&cgroup_mutex);
-       /* @ss can't be mounted here as try_module_get() would fail */
-       cgroup_unload_subsys(ss);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(cgroup_load_subsys);
-
-/**
- * cgroup_unload_subsys: unload a modular subsystem
- * @ss: the subsystem to unload
- *
- * This function should be called in a modular subsystem's exitcall. When this
- * function is invoked, the refcount on the subsystem's module will be 0, so
- * the subsystem will not be attached to any hierarchy.
- */
-void cgroup_unload_subsys(struct cgroup_subsys *ss)
-{
-       struct cgrp_cset_link *link;
-       struct cgroup_subsys_state *css;
-
-       BUG_ON(ss->module == NULL);
-
-       /*
-        * we shouldn't be called if the subsystem is in use, and the use of
-        * try_module_get() in rebind_subsystems() should ensure that it
-        * doesn't start being used while we're killing it off.
-        */
-       BUG_ON(ss->root != &cgroup_dummy_root);
-
-       mutex_lock(&cgroup_mutex);
-       mutex_lock(&cgroup_root_mutex);
-
-       css = cgroup_css(cgroup_dummy_top, ss);
-       if (css)
-               offline_css(css);
-
-       /* deassign the subsys_id */
-       cgroup_subsys[ss->subsys_id] = NULL;
-
-       /*
-        * disentangle the css from all css_sets attached to the dummy
-        * top. as in loading, we need to pay our respects to the hashtable
-        * gods.
-        */
-       write_lock(&css_set_lock);
-       list_for_each_entry(link, &cgroup_dummy_top->cset_links, cset_link) {
-               struct css_set *cset = link->cset;
-               unsigned long key;
-
-               hash_del(&cset->hlist);
-               cset->subsys[ss->subsys_id] = NULL;
-               key = css_set_hash(cset->subsys);
-               hash_add(css_set_table, &cset->hlist, key);
-       }
-       write_unlock(&css_set_lock);
-
-       /*
-        * remove subsystem's css from the cgroup_dummy_top and free it -
-        * need to free before marking as null because ss->css_free needs
-        * the cgrp->subsys pointer to find their state.
-        */
-       if (css)
-               ss->css_free(css);
-       RCU_INIT_POINTER(cgroup_dummy_top->subsys[ss->subsys_id], NULL);
-
-       mutex_unlock(&cgroup_root_mutex);
-       mutex_unlock(&cgroup_mutex);
-}
-EXPORT_SYMBOL_GPL(cgroup_unload_subsys);
-
 /**
  * cgroup_init_early - cgroup initialization at system boot
  *
@@ -4760,17 +4507,16 @@ int __init cgroup_init_early(void)
        list_add(&init_cgrp_cset_link.cset_link, &cgroup_dummy_top->cset_links);
        list_add(&init_cgrp_cset_link.cgrp_link, &init_css_set.cgrp_links);
 
-       /* at bootup time, we don't worry about modular subsystems */
-       for_each_builtin_subsys(ss, i) {
-               BUG_ON(!ss->name);
-               BUG_ON(strlen(ss->name) > MAX_CGROUP_TYPE_NAMELEN);
-               BUG_ON(!ss->css_alloc);
-               BUG_ON(!ss->css_free);
-               if (ss->subsys_id != i) {
-                       printk(KERN_ERR "cgroup: Subsys %s id == %d\n",
-                              ss->name, ss->subsys_id);
-                       BUG();
-               }
+       for_each_subsys(ss, i) {
+               WARN(!ss->css_alloc || !ss->css_free || ss->name || ss->id,
+                    "invalid cgroup_subsys %d:%s css_alloc=%p css_free=%p name:id=%d:%s\n",
+                    i, cgroup_subsys_name[i], ss->css_alloc, ss->css_free,
+                    ss->id, ss->name);
+               WARN(strlen(cgroup_subsys_name[i]) > MAX_CGROUP_TYPE_NAMELEN,
+                    "cgroup_subsys_name %s too long\n", cgroup_subsys_name[i]);
+
+               ss->id = i;
+               ss->name = cgroup_subsys_name[i];
 
                if (ss->early_init)
                        cgroup_init_subsys(ss);
@@ -4794,14 +4540,13 @@ int __init cgroup_init(void)
        if (err)
                return err;
 
-       for_each_builtin_subsys(ss, i) {
+       for_each_subsys(ss, i) {
                if (!ss->early_init)
                        cgroup_init_subsys(ss);
        }
 
        /* allocate id for the dummy hierarchy */
        mutex_lock(&cgroup_mutex);
-       mutex_lock(&cgroup_root_mutex);
 
        /* Add init_css_set to the hash table */
        key = css_set_hash(init_css_set.subsys);
@@ -4813,7 +4558,6 @@ int __init cgroup_init(void)
                        0, 1, GFP_KERNEL);
        BUG_ON(err < 0);
 
-       mutex_unlock(&cgroup_root_mutex);
        mutex_unlock(&cgroup_mutex);
 
        cgroup_kobj = kobject_create_and_add("cgroup", fs_kobj);
@@ -5033,15 +4777,7 @@ void cgroup_post_fork(struct task_struct *child)
         * and addition to css_set.
         */
        if (need_forkexit_callback) {
-               /*
-                * fork/exit callbacks are supported only for builtin
-                * subsystems, and the builtin section of the subsys
-                * array is immutable, so we don't need to lock the
-                * subsys array here. On the other hand, modular section
-                * of the array can be freed at module unload, so we
-                * can't touch that.
-                */
-               for_each_builtin_subsys(ss, i)
+               for_each_subsys(ss, i)
                        if (ss->fork)
                                ss->fork(child);
        }
@@ -5106,11 +4842,8 @@ void cgroup_exit(struct task_struct *tsk, int run_callbacks)
        RCU_INIT_POINTER(tsk->cgroups, &init_css_set);
 
        if (run_callbacks && need_forkexit_callback) {
-               /*
-                * fork/exit callbacks are supported only for builtin
-                * subsystems, see cgroup_post_fork() for details.
-                */
-               for_each_builtin_subsys(ss, i) {
+               /* see cgroup_post_fork() for details */
+               for_each_subsys(ss, i) {
                        if (ss->exit) {
                                struct cgroup_subsys_state *old_css = cset->subsys[i];
                                struct cgroup_subsys_state *css = task_css(tsk, i);
@@ -5229,11 +4962,7 @@ static int __init cgroup_disable(char *str)
                if (!*token)
                        continue;
 
-               /*
-                * cgroup_disable, being at boot time, can't know about
-                * module subsystems, so we don't worry about them.
-                */
-               for_each_builtin_subsys(ss, i) {
+               for_each_subsys(ss, i) {
                        if (!strcmp(token, ss->name)) {
                                ss->disabled = 1;
                                printk(KERN_INFO "Disabling %s control group"
@@ -5420,11 +5149,9 @@ static struct cftype debug_files[] =  {
        { }     /* terminate */
 };
 
-struct cgroup_subsys debug_subsys = {
-       .name = "debug",
+struct cgroup_subsys debug_cgrp_subsys = {
        .css_alloc = debug_css_alloc,
        .css_free = debug_css_free,
-       .subsys_id = debug_subsys_id,
        .base_cftypes = debug_files,
 };
 #endif /* CONFIG_CGROUP_DEBUG */
index 6c3154e477f601deb7588317b9cbc6d7267cbed2..98ea26a99076198601b98ce2829b6ff5e741b74e 100644 (file)
@@ -52,7 +52,7 @@ static inline struct freezer *css_freezer(struct cgroup_subsys_state *css)
 
 static inline struct freezer *task_freezer(struct task_struct *task)
 {
-       return css_freezer(task_css(task, freezer_subsys_id));
+       return css_freezer(task_css(task, freezer_cgrp_id));
 }
 
 static struct freezer *parent_freezer(struct freezer *freezer)
@@ -84,8 +84,6 @@ static const char *freezer_state_strs(unsigned int state)
        return "THAWED";
 };
 
-struct cgroup_subsys freezer_subsys;
-
 static struct cgroup_subsys_state *
 freezer_css_alloc(struct cgroup_subsys_state *parent_css)
 {
@@ -473,13 +471,11 @@ static struct cftype files[] = {
        { }     /* terminate */
 };
 
-struct cgroup_subsys freezer_subsys = {
-       .name           = "freezer",
+struct cgroup_subsys freezer_cgrp_subsys = {
        .css_alloc      = freezer_css_alloc,
        .css_online     = freezer_css_online,
        .css_offline    = freezer_css_offline,
        .css_free       = freezer_css_free,
-       .subsys_id      = freezer_subsys_id,
        .attach         = freezer_attach,
        .fork           = freezer_fork,
        .base_cftypes   = files,
index 4410ac6a55f1d9ae410976e3a8e7315acf88a61b..2d018c795fea0bae4c7ddf4a03dee05303eb15b7 100644 (file)
@@ -119,7 +119,7 @@ static inline struct cpuset *css_cs(struct cgroup_subsys_state *css)
 /* Retrieve the cpuset for a task */
 static inline struct cpuset *task_cs(struct task_struct *task)
 {
-       return css_cs(task_css(task, cpuset_subsys_id));
+       return css_cs(task_css(task, cpuset_cgrp_id));
 }
 
 static inline struct cpuset *parent_cs(struct cpuset *cs)
@@ -1521,7 +1521,7 @@ static void cpuset_attach(struct cgroup_subsys_state *css,
        struct task_struct *task;
        struct task_struct *leader = cgroup_taskset_first(tset);
        struct cgroup_subsys_state *oldcss = cgroup_taskset_cur_css(tset,
-                                                       cpuset_subsys_id);
+                                                       cpuset_cgrp_id);
        struct cpuset *cs = css_cs(css);
        struct cpuset *oldcs = css_cs(oldcss);
        struct cpuset *cpus_cs = effective_cpumask_cpuset(cs);
@@ -2024,8 +2024,7 @@ static void cpuset_css_free(struct cgroup_subsys_state *css)
        kfree(cs);
 }
 
-struct cgroup_subsys cpuset_subsys = {
-       .name = "cpuset",
+struct cgroup_subsys cpuset_cgrp_subsys = {
        .css_alloc = cpuset_css_alloc,
        .css_online = cpuset_css_online,
        .css_offline = cpuset_css_offline,
@@ -2033,7 +2032,6 @@ struct cgroup_subsys cpuset_subsys = {
        .can_attach = cpuset_can_attach,
        .cancel_attach = cpuset_cancel_attach,
        .attach = cpuset_attach,
-       .subsys_id = cpuset_subsys_id,
        .base_cftypes = files,
        .early_init = 1,
 };
@@ -2699,7 +2697,7 @@ int proc_cpuset_show(struct seq_file *m, void *unused_v)
                goto out_free;
 
        rcu_read_lock();
-       css = task_css(tsk, cpuset_subsys_id);
+       css = task_css(tsk, cpuset_cgrp_id);
        retval = cgroup_path(css->cgroup, buf, PAGE_SIZE);
        rcu_read_unlock();
        if (retval < 0)
index 56003c6edfd38c03e8dd523f1efb01d99bcf2e84..64903731d834adf3aaba4c2aee5a42069a6ba5b0 100644 (file)
@@ -342,7 +342,7 @@ struct perf_cgroup {
 static inline struct perf_cgroup *
 perf_cgroup_from_task(struct task_struct *task)
 {
-       return container_of(task_css(task, perf_subsys_id),
+       return container_of(task_css(task, perf_event_cgrp_id),
                            struct perf_cgroup, css);
 }
 
@@ -595,7 +595,7 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event,
 
        rcu_read_lock();
 
-       css = css_from_dir(f.file->f_dentry, &perf_subsys);
+       css = css_from_dir(f.file->f_dentry, &perf_event_cgrp_subsys);
        if (IS_ERR(css)) {
                ret = PTR_ERR(css);
                goto out;
@@ -8055,9 +8055,7 @@ static void perf_cgroup_exit(struct cgroup_subsys_state *css,
        task_function_call(task, __perf_cgroup_move, task);
 }
 
-struct cgroup_subsys perf_subsys = {
-       .name           = "perf_event",
-       .subsys_id      = perf_subsys_id,
+struct cgroup_subsys perf_event_cgrp_subsys = {
        .css_alloc      = perf_cgroup_css_alloc,
        .css_free       = perf_cgroup_css_free,
        .exit           = perf_cgroup_exit,
index b46131ef6aab0ac48149482a03f8354330adf188..d4cfc5561830dc870eae869fabed3a83b5df8824 100644 (file)
@@ -7176,7 +7176,7 @@ void sched_move_task(struct task_struct *tsk)
        if (unlikely(running))
                tsk->sched_class->put_prev_task(rq, tsk);
 
-       tg = container_of(task_css_check(tsk, cpu_cgroup_subsys_id,
+       tg = container_of(task_css_check(tsk, cpu_cgrp_id,
                                lockdep_is_held(&tsk->sighand->siglock)),
                          struct task_group, css);
        tg = autogroup_task_group(tsk, tg);
@@ -7957,8 +7957,7 @@ static struct cftype cpu_files[] = {
        { }     /* terminate */
 };
 
-struct cgroup_subsys cpu_cgroup_subsys = {
-       .name           = "cpu",
+struct cgroup_subsys cpu_cgrp_subsys = {
        .css_alloc      = cpu_cgroup_css_alloc,
        .css_free       = cpu_cgroup_css_free,
        .css_online     = cpu_cgroup_css_online,
@@ -7966,7 +7965,6 @@ struct cgroup_subsys cpu_cgroup_subsys = {
        .can_attach     = cpu_cgroup_can_attach,
        .attach         = cpu_cgroup_attach,
        .exit           = cpu_cgroup_exit,
-       .subsys_id      = cpu_cgroup_subsys_id,
        .base_cftypes   = cpu_files,
        .early_init     = 1,
 };
index 622e0818f9054cf4d5d60a7543441b2c0abd9ebc..c143ee380e3ae0c0f0ca9fc4cc143278064bf02f 100644 (file)
@@ -41,7 +41,7 @@ static inline struct cpuacct *css_ca(struct cgroup_subsys_state *css)
 /* return cpu accounting group to which this task belongs */
 static inline struct cpuacct *task_ca(struct task_struct *tsk)
 {
-       return css_ca(task_css(tsk, cpuacct_subsys_id));
+       return css_ca(task_css(tsk, cpuacct_cgrp_id));
 }
 
 static inline struct cpuacct *parent_ca(struct cpuacct *ca)
@@ -275,11 +275,9 @@ void cpuacct_account_field(struct task_struct *p, int index, u64 val)
        rcu_read_unlock();
 }
 
-struct cgroup_subsys cpuacct_subsys = {
-       .name           = "cpuacct",
+struct cgroup_subsys cpuacct_cgrp_subsys = {
        .css_alloc      = cpuacct_css_alloc,
        .css_free       = cpuacct_css_free,
-       .subsys_id      = cpuacct_subsys_id,
        .base_cftypes   = files,
        .early_init     = 1,
 };
index cb00829bb4663bf0272d2140f0ebd07afca0751d..b135853e68f3134b79a5b4a3e03c13b1b9999d29 100644 (file)
@@ -30,7 +30,6 @@ struct hugetlb_cgroup {
 #define MEMFILE_IDX(val)       (((val) >> 16) & 0xffff)
 #define MEMFILE_ATTR(val)      ((val) & 0xffff)
 
-struct cgroup_subsys hugetlb_subsys __read_mostly;
 static struct hugetlb_cgroup *root_h_cgroup __read_mostly;
 
 static inline
@@ -42,7 +41,7 @@ struct hugetlb_cgroup *hugetlb_cgroup_from_css(struct cgroup_subsys_state *s)
 static inline
 struct hugetlb_cgroup *hugetlb_cgroup_from_task(struct task_struct *task)
 {
-       return hugetlb_cgroup_from_css(task_css(task, hugetlb_subsys_id));
+       return hugetlb_cgroup_from_css(task_css(task, hugetlb_cgrp_id));
 }
 
 static inline bool hugetlb_cgroup_is_root(struct hugetlb_cgroup *h_cg)
@@ -358,7 +357,7 @@ static void __init __hugetlb_cgroup_file_init(int idx)
        cft = &h->cgroup_files[4];
        memset(cft, 0, sizeof(*cft));
 
-       WARN_ON(cgroup_add_cftypes(&hugetlb_subsys, h->cgroup_files));
+       WARN_ON(cgroup_add_cftypes(&hugetlb_cgrp_subsys, h->cgroup_files));
 
        return;
 }
@@ -402,10 +401,8 @@ void hugetlb_cgroup_migrate(struct page *oldhpage, struct page *newhpage)
        return;
 }
 
-struct cgroup_subsys hugetlb_subsys = {
-       .name = "hugetlb",
+struct cgroup_subsys hugetlb_cgrp_subsys = {
        .css_alloc      = hugetlb_cgroup_css_alloc,
        .css_offline    = hugetlb_cgroup_css_offline,
        .css_free       = hugetlb_cgroup_css_free,
-       .subsys_id      = hugetlb_subsys_id,
 };
index 53385cd4e6f02cfae85f99a2629f735094130c78..04a97bce22703965e6486b8cf5e74b13eb70ef26 100644 (file)
@@ -66,8 +66,8 @@
 
 #include <trace/events/vmscan.h>
 
-struct cgroup_subsys mem_cgroup_subsys __read_mostly;
-EXPORT_SYMBOL(mem_cgroup_subsys);
+struct cgroup_subsys memory_cgrp_subsys __read_mostly;
+EXPORT_SYMBOL(memory_cgrp_subsys);
 
 #define MEM_CGROUP_RECLAIM_RETRIES     5
 static struct mem_cgroup *root_mem_cgroup __read_mostly;
@@ -538,7 +538,7 @@ static inline struct mem_cgroup *mem_cgroup_from_id(unsigned short id)
 {
        struct cgroup_subsys_state *css;
 
-       css = css_from_id(id - 1, &mem_cgroup_subsys);
+       css = css_from_id(id - 1, &memory_cgrp_subsys);
        return mem_cgroup_from_css(css);
 }
 
@@ -1072,7 +1072,7 @@ struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p)
        if (unlikely(!p))
                return NULL;
 
-       return mem_cgroup_from_css(task_css(p, mem_cgroup_subsys_id));
+       return mem_cgroup_from_css(task_css(p, memory_cgrp_id));
 }
 
 struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm)
@@ -1702,7 +1702,7 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
        rcu_read_lock();
 
        mem_cgrp = memcg->css.cgroup;
-       task_cgrp = task_cgroup(p, mem_cgroup_subsys_id);
+       task_cgrp = task_cgroup(p, memory_cgrp_id);
 
        ret = cgroup_path(task_cgrp, memcg_name, PATH_MAX);
        if (ret < 0) {
@@ -6187,7 +6187,7 @@ static int memcg_write_event_control(struct cgroup_subsys_state *css,
 
        ret = -EINVAL;
        cfile_css = css_from_dir(cfile.file->f_dentry->d_parent,
-                                &mem_cgroup_subsys);
+                                &memory_cgrp_subsys);
        if (cfile_css == css && css_tryget(css))
                ret = 0;
 
@@ -6566,11 +6566,11 @@ mem_cgroup_css_online(struct cgroup_subsys_state *css)
                 * unfortunate state in our controller.
                 */
                if (parent != root_mem_cgroup)
-                       mem_cgroup_subsys.broken_hierarchy = true;
+                       memory_cgrp_subsys.broken_hierarchy = true;
        }
        mutex_unlock(&memcg_create_mutex);
 
-       return memcg_init_kmem(memcg, &mem_cgroup_subsys);
+       return memcg_init_kmem(memcg, &memory_cgrp_subsys);
 }
 
 /*
@@ -7264,9 +7264,7 @@ static void mem_cgroup_bind(struct cgroup_subsys_state *root_css)
                mem_cgroup_from_css(root_css)->use_hierarchy = true;
 }
 
-struct cgroup_subsys mem_cgroup_subsys = {
-       .name = "memory",
-       .subsys_id = mem_cgroup_subsys_id,
+struct cgroup_subsys memory_cgrp_subsys = {
        .css_alloc = mem_cgroup_css_alloc,
        .css_online = mem_cgroup_css_online,
        .css_offline = mem_cgroup_css_offline,
@@ -7292,7 +7290,7 @@ __setup("swapaccount=", enable_swap_account);
 
 static void __init memsw_file_init(void)
 {
-       WARN_ON(cgroup_add_cftypes(&mem_cgroup_subsys, memsw_cgroup_files));
+       WARN_ON(cgroup_add_cftypes(&memory_cgrp_subsys, memsw_cgroup_files));
 }
 
 static void __init enable_swap_cgroup(void)
index e411046a62e3f0fe82281bc6b97dd8a1183558d1..a83bc4cc45a485c72e30301482a8216055a331b7 100644 (file)
@@ -239,7 +239,7 @@ config XPS
        default y
 
 config CGROUP_NET_PRIO
-       tristate "Network priority cgroup"
+       bool "Network priority cgroup"
        depends on CGROUPS
        ---help---
          Cgroup subsystem for use in assigning processes to network priorities on
index 719efd541668c9b91fd79d6faa228c0923dafe24..b865662fba713c96db485aca31e5e19a9fbe886b 100644 (file)
@@ -23,7 +23,7 @@ static inline struct cgroup_cls_state *css_cls_state(struct cgroup_subsys_state
 
 struct cgroup_cls_state *task_cls_state(struct task_struct *p)
 {
-       return css_cls_state(task_css(p, net_cls_subsys_id));
+       return css_cls_state(task_css(p, net_cls_cgrp_id));
 }
 EXPORT_SYMBOL_GPL(task_cls_state);
 
@@ -102,19 +102,10 @@ static struct cftype ss_files[] = {
        { }     /* terminate */
 };
 
-struct cgroup_subsys net_cls_subsys = {
-       .name                   = "net_cls",
+struct cgroup_subsys net_cls_cgrp_subsys = {
        .css_alloc              = cgrp_css_alloc,
        .css_online             = cgrp_css_online,
        .css_free               = cgrp_css_free,
        .attach                 = cgrp_attach,
-       .subsys_id              = net_cls_subsys_id,
        .base_cftypes           = ss_files,
-       .module                 = THIS_MODULE,
 };
-
-static int __init init_netclassid_cgroup(void)
-{
-       return cgroup_load_subsys(&net_cls_subsys);
-}
-__initcall(init_netclassid_cgroup);
index 9043caedcd083bf48836d0a970d48d8c533f86ee..d7d23e28fafda0097655b9df1ec54b57ee75eb3c 100644 (file)
@@ -244,15 +244,12 @@ static struct cftype ss_files[] = {
        { }     /* terminate */
 };
 
-struct cgroup_subsys net_prio_subsys = {
-       .name           = "net_prio",
+struct cgroup_subsys net_prio_cgrp_subsys = {
        .css_alloc      = cgrp_css_alloc,
        .css_online     = cgrp_css_online,
        .css_free       = cgrp_css_free,
        .attach         = net_prio_attach,
-       .subsys_id      = net_prio_subsys_id,
        .base_cftypes   = ss_files,
-       .module         = THIS_MODULE,
 };
 
 static int netprio_device_event(struct notifier_block *unused,
@@ -283,37 +280,9 @@ static struct notifier_block netprio_device_notifier = {
 
 static int __init init_cgroup_netprio(void)
 {
-       int ret;
-
-       ret = cgroup_load_subsys(&net_prio_subsys);
-       if (ret)
-               goto out;
-
        register_netdevice_notifier(&netprio_device_notifier);
-
-out:
-       return ret;
-}
-
-static void __exit exit_cgroup_netprio(void)
-{
-       struct netprio_map *old;
-       struct net_device *dev;
-
-       unregister_netdevice_notifier(&netprio_device_notifier);
-
-       cgroup_unload_subsys(&net_prio_subsys);
-
-       rtnl_lock();
-       for_each_netdev(&init_net, dev) {
-               old = rtnl_dereference(dev->priomap);
-               RCU_INIT_POINTER(dev->priomap, NULL);
-               if (old)
-                       kfree_rcu(old, rcu);
-       }
-       rtnl_unlock();
+       return 0;
 }
 
-module_init(init_cgroup_netprio);
-module_exit(exit_cgroup_netprio);
+subsys_initcall(init_cgroup_netprio);
 MODULE_LICENSE("GPL v2");
index f7e522c558ba2eb43165f85d46c2ba3a91ce42eb..20a0aca9131edfec97eab77437225ad9698b3b02 100644 (file)
@@ -219,7 +219,7 @@ static struct cftype tcp_files[] = {
 
 static int __init tcp_memcontrol_init(void)
 {
-       WARN_ON(cgroup_add_cftypes(&mem_cgroup_subsys, tcp_files));
+       WARN_ON(cgroup_add_cftypes(&memory_cgrp_subsys, tcp_files));
        return 0;
 }
 __initcall(tcp_memcontrol_init);
index d3b6d2cd3a06272a4f6cbd2ed75870db28ad5b48..7f88bcde7c61a42d355e81ead4719f86bab27630 100644 (file)
@@ -58,11 +58,9 @@ static inline struct dev_cgroup *css_to_devcgroup(struct cgroup_subsys_state *s)
 
 static inline struct dev_cgroup *task_devcgroup(struct task_struct *task)
 {
-       return css_to_devcgroup(task_css(task, devices_subsys_id));
+       return css_to_devcgroup(task_css(task, devices_cgrp_id));
 }
 
-struct cgroup_subsys devices_subsys;
-
 /*
  * called under devcgroup_mutex
  */
@@ -684,13 +682,11 @@ static struct cftype dev_cgroup_files[] = {
        { }     /* terminate */
 };
 
-struct cgroup_subsys devices_subsys = {
-       .name = "devices",
+struct cgroup_subsys devices_cgrp_subsys = {
        .css_alloc = devcgroup_css_alloc,
        .css_free = devcgroup_css_free,
        .css_online = devcgroup_online,
        .css_offline = devcgroup_offline,
-       .subsys_id = devices_subsys_id,
        .base_cftypes = dev_cgroup_files,
 };