cgroup: replace cgroup_subsys->disabled tests with cgroup_subsys_enabled()
authorTejun Heo <tj@kernel.org>
Fri, 18 Sep 2015 15:56:28 +0000 (11:56 -0400)
committerTejun Heo <tj@kernel.org>
Fri, 18 Sep 2015 15:56:28 +0000 (11:56 -0400)
Replace cgroup_subsys->disabled tests in controllers with
cgroup_subsys_enabled().  cgroup_subsys_enabled() requires literal
subsys name as its parameter and thus can't be used for cgroup core
which iterates through controllers.  For cgroup core, introduce and
use cgroup_ssid_enabled() which uses slower static_key_enabled() test
and can be indexed by subsys ID.

This leaves cgroup_subsys->disabled unused.  Removed.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Zefan Li <lizefan@huawei.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@kernel.org>
include/linux/cgroup-defs.h
include/linux/hugetlb_cgroup.h
include/linux/memcontrol.h
kernel/cgroup.c

index 4d8fcf2187dcaa822b8f629655e83d667a9913ac..c5d41c3c1f003bd4acc69390f6488ab711959903 100644 (file)
@@ -419,7 +419,6 @@ struct cgroup_subsys {
                     struct task_struct *task);
        void (*bind)(struct cgroup_subsys_state *root_css);
 
-       int disabled;
        int early_init;
 
        /*
index bcc853eccc85ba6ab38fc903263db60723dca553..7edd305152983af1ab6aee93f470dd99289046e8 100644 (file)
@@ -48,9 +48,7 @@ int set_hugetlb_cgroup(struct page *page, struct hugetlb_cgroup *h_cg)
 
 static inline bool hugetlb_cgroup_disabled(void)
 {
-       if (hugetlb_cgrp_subsys.disabled)
-               return true;
-       return false;
+       return !cgroup_subsys_enabled(hugetlb_cgrp_subsys);
 }
 
 extern int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
index ad800e62cb7a603fdd5f7fb1a752edb03417dbb4..9aa7820c2177e4a7be9b130120a1f216f4eb246d 100644 (file)
@@ -347,9 +347,7 @@ ino_t page_cgroup_ino(struct page *page);
 
 static inline bool mem_cgroup_disabled(void)
 {
-       if (memory_cgrp_subsys.disabled)
-               return true;
-       return false;
+       return !cgroup_subsys_enabled(memory_cgrp_subsys);
 }
 
 /*
index 361938911bd170265c4e50012fa68494b6f17535..5703ba791b3d1e79d02d6b8fe854a3bab233aaae 100644 (file)
@@ -224,6 +224,19 @@ static void kill_css(struct cgroup_subsys_state *css);
 static int cgroup_addrm_files(struct cgroup *cgrp, struct cftype cfts[],
                              bool is_add);
 
+/**
+ * cgroup_ssid_enabled - cgroup subsys enabled test by subsys ID
+ * @ssid: subsys ID of interest
+ *
+ * cgroup_subsys_enabled() can only be used with literal subsys names which
+ * is fine for individual subsystems but unsuitable for cgroup core.  This
+ * is slower static_key_enabled() based test indexed by @ssid.
+ */
+static bool cgroup_ssid_enabled(int ssid)
+{
+       return static_key_enabled(cgroup_subsys_enabled_key[ssid]);
+}
+
 /* IDR wrappers which synchronize using cgroup_idr_lock */
 static int cgroup_idr_alloc(struct idr *idr, void *ptr, int start, int end,
                            gfp_t gfp_mask)
@@ -1482,7 +1495,7 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts)
                for_each_subsys(ss, i) {
                        if (strcmp(token, ss->legacy_name))
                                continue;
-                       if (ss->disabled)
+                       if (!cgroup_ssid_enabled(i))
                                continue;
 
                        /* Mutually exclusive option 'all' + subsystem name */
@@ -1513,7 +1526,7 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts)
         */
        if (all_ss || (!one_ss && !opts->none && !opts->name))
                for_each_subsys(ss, i)
-                       if (!ss->disabled)
+                       if (cgroup_ssid_enabled(i))
                                opts->subsys_mask |= (1 << i);
 
        /*
@@ -2762,7 +2775,8 @@ static ssize_t cgroup_subtree_control_write(struct kernfs_open_file *of,
                if (tok[0] == '\0')
                        continue;
                for_each_subsys_which(ss, ssid, &tmp_ss_mask) {
-                       if (ss->disabled || strcmp(tok + 1, ss->name))
+                       if (!cgroup_ssid_enabled(ssid) ||
+                           strcmp(tok + 1, ss->name))
                                continue;
 
                        if (*tok == '+') {
@@ -3320,7 +3334,7 @@ static int cgroup_add_cftypes(struct cgroup_subsys *ss, struct cftype *cfts)
 {
        int ret;
 
-       if (ss->disabled)
+       if (!cgroup_ssid_enabled(ss->id))
                return 0;
 
        if (!cfts || cfts[0].name[0] == '\0')
@@ -5082,7 +5096,7 @@ int __init cgroup_init(void)
                 * disabled flag and cftype registration needs kmalloc,
                 * both of which aren't available during early_init.
                 */
-               if (ss->disabled)
+               if (!cgroup_ssid_enabled(ssid))
                        continue;
 
                cgrp_dfl_root.subsys_mask |= 1 << ss->id;
@@ -5217,7 +5231,8 @@ static int proc_cgroupstats_show(struct seq_file *m, void *v)
        for_each_subsys(ss, i)
                seq_printf(m, "%s\t%d\t%d\t%d\n",
                           ss->legacy_name, ss->root->hierarchy_id,
-                          atomic_read(&ss->root->nr_cgrps), !ss->disabled);
+                          atomic_read(&ss->root->nr_cgrps),
+                          cgroup_ssid_enabled(i));
 
        mutex_unlock(&cgroup_mutex);
        return 0;
@@ -5508,7 +5523,6 @@ static int __init cgroup_disable(char *str)
                                continue;
 
                        static_branch_disable(cgroup_subsys_enabled_key[i]);
-                       ss->disabled = 1;
                        printk(KERN_INFO "Disabling %s control group subsystem\n",
                               ss->name);
                        break;