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)
                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 */
         */
        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);
 
        /*
                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 == '+') {
 {
        int ret;
 
-       if (ss->disabled)
+       if (!cgroup_ssid_enabled(ss->id))
                return 0;
 
        if (!cfts || cfts[0].name[0] == '\0')
                 * 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;
        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;
                                continue;
 
                        static_branch_disable(cgroup_subsys_enabled_key[i]);
-                       ss->disabled = 1;
                        printk(KERN_INFO "Disabling %s control group subsystem\n",
                               ss->name);
                        break;