|
@@ -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;
|