UPSTREAM: cgroup: Add named hierarchy disabling to cgroup_no_v1 boot param

It can be useful to inhibit all cgroup1 hierarchies especially during
transition and for debugging.  cgroup_no_v1 can block hierarchies with
controllers which leaves out the named hierarchies.  Expand it to
cover the named hierarchies so that "cgroup_no_v1=all,named" disables
all cgroup1 hierarchies.

Signed-off-by: Tejun Heo <tj@kernel.org>
Suggested-by: Marcin Pawlowski <mpawlowski@fb.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Change-Id: Ibd093dd9b70d15402a21db3c1ef56005ebc7f99e
(cherry picked from commit 3fc9c12d27b4ded4f1f761a800558dab2e6bbac5)
Bug: 154548692
Signed-off-by: Marco Ballesio <balejs@google.com>
This commit is contained in:
Tejun Heo 2018-12-28 10:31:07 -08:00 committed by Marco Ballesio
parent 0d53c30064
commit ce5f91bdfa
2 changed files with 19 additions and 3 deletions

View file

@ -490,10 +490,14 @@
cut the overhead, others just disable the usage. So cut the overhead, others just disable the usage. So
only cgroup_disable=memory is actually worthy} only cgroup_disable=memory is actually worthy}
cgroup_no_v1= [KNL] Disable one, multiple, all cgroup controllers in v1 cgroup_no_v1= [KNL] Disable cgroup controllers and named hierarchies in v1
Format: { controller[,controller...] | "all" } Format: { { controller | "all" | "named" }
[,{ controller | "all" | "named" }...] }
Like cgroup_disable, but only applies to cgroup v1; Like cgroup_disable, but only applies to cgroup v1;
the blacklisted controllers remain available in cgroup2. the blacklisted controllers remain available in cgroup2.
"all" blacklists all controllers and "named" disables
named mounts. Specifying both "all" and "named" disables
all v1 hierarchies.
cgroup.memory= [KNL] Pass options to the cgroup memory controller. cgroup.memory= [KNL] Pass options to the cgroup memory controller.
Format: <string> Format: <string>

View file

@ -27,6 +27,9 @@
/* Controllers blocked by the commandline in v1 */ /* Controllers blocked by the commandline in v1 */
static u16 cgroup_no_v1_mask; static u16 cgroup_no_v1_mask;
/* disable named v1 mounts */
static bool cgroup_no_v1_named;
/* /*
* pidlist destructions need to be flushed on cgroup destruction. Use a * pidlist destructions need to be flushed on cgroup destruction. Use a
* separate workqueue as flush domain. * separate workqueue as flush domain.
@ -965,6 +968,10 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts)
} }
if (!strncmp(token, "name=", 5)) { if (!strncmp(token, "name=", 5)) {
const char *name = token + 5; const char *name = token + 5;
/* blocked by boot param? */
if (cgroup_no_v1_named)
return -ENOENT;
/* Can't specify an empty name */ /* Can't specify an empty name */
if (!strlen(name)) if (!strlen(name))
return -EINVAL; return -EINVAL;
@ -1294,7 +1301,12 @@ static int __init cgroup_no_v1(char *str)
if (!strcmp(token, "all")) { if (!strcmp(token, "all")) {
cgroup_no_v1_mask = U16_MAX; cgroup_no_v1_mask = U16_MAX;
break; continue;
}
if (!strcmp(token, "named")) {
cgroup_no_v1_named = true;
continue;
} }
for_each_subsys(ss, i) { for_each_subsys(ss, i) {