|
@@ -782,7 +782,14 @@ static int parse_cgroupfs_options(char *data,
|
|
if (!*token)
|
|
if (!*token)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
if (!strcmp(token, "all")) {
|
|
if (!strcmp(token, "all")) {
|
|
- opts->subsys_bits = (1 << CGROUP_SUBSYS_COUNT) - 1;
|
|
|
|
|
|
+ /* Add all non-disabled subsystems */
|
|
|
|
+ int i;
|
|
|
|
+ opts->subsys_bits = 0;
|
|
|
|
+ for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
|
|
|
|
+ struct cgroup_subsys *ss = subsys[i];
|
|
|
|
+ if (!ss->disabled)
|
|
|
|
+ opts->subsys_bits |= 1ul << i;
|
|
|
|
+ }
|
|
} else if (!strcmp(token, "noprefix")) {
|
|
} else if (!strcmp(token, "noprefix")) {
|
|
set_bit(ROOT_NOPREFIX, &opts->flags);
|
|
set_bit(ROOT_NOPREFIX, &opts->flags);
|
|
} else if (!strncmp(token, "release_agent=", 14)) {
|
|
} else if (!strncmp(token, "release_agent=", 14)) {
|
|
@@ -800,7 +807,8 @@ static int parse_cgroupfs_options(char *data,
|
|
for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
|
|
for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
|
|
ss = subsys[i];
|
|
ss = subsys[i];
|
|
if (!strcmp(token, ss->name)) {
|
|
if (!strcmp(token, ss->name)) {
|
|
- set_bit(i, &opts->subsys_bits);
|
|
|
|
|
|
+ if (!ss->disabled)
|
|
|
|
+ set_bit(i, &opts->subsys_bits);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -2600,13 +2608,13 @@ static int proc_cgroupstats_show(struct seq_file *m, void *v)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- seq_puts(m, "#subsys_name\thierarchy\tnum_cgroups\n");
|
|
|
|
|
|
+ seq_puts(m, "#subsys_name\thierarchy\tnum_cgroups\tenabled\n");
|
|
mutex_lock(&cgroup_mutex);
|
|
mutex_lock(&cgroup_mutex);
|
|
for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
|
|
for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
|
|
struct cgroup_subsys *ss = subsys[i];
|
|
struct cgroup_subsys *ss = subsys[i];
|
|
- seq_printf(m, "%s\t%lu\t%d\n",
|
|
|
|
|
|
+ seq_printf(m, "%s\t%lu\t%d\t%d\n",
|
|
ss->name, ss->root->subsys_bits,
|
|
ss->name, ss->root->subsys_bits,
|
|
- ss->root->number_of_cgroups);
|
|
|
|
|
|
+ ss->root->number_of_cgroups, !ss->disabled);
|
|
}
|
|
}
|
|
mutex_unlock(&cgroup_mutex);
|
|
mutex_unlock(&cgroup_mutex);
|
|
return 0;
|
|
return 0;
|
|
@@ -3010,3 +3018,27 @@ static void cgroup_release_agent(struct work_struct *work)
|
|
spin_unlock(&release_list_lock);
|
|
spin_unlock(&release_list_lock);
|
|
mutex_unlock(&cgroup_mutex);
|
|
mutex_unlock(&cgroup_mutex);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+static int __init cgroup_disable(char *str)
|
|
|
|
+{
|
|
|
|
+ int i;
|
|
|
|
+ char *token;
|
|
|
|
+
|
|
|
|
+ while ((token = strsep(&str, ",")) != NULL) {
|
|
|
|
+ if (!*token)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
|
|
|
|
+ struct cgroup_subsys *ss = subsys[i];
|
|
|
|
+
|
|
|
|
+ if (!strcmp(token, ss->name)) {
|
|
|
|
+ ss->disabled = 1;
|
|
|
|
+ printk(KERN_INFO "Disabling %s control group"
|
|
|
|
+ " subsystem\n", ss->name);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+__setup("cgroup_disable=", cgroup_disable);
|