cgroup/cpuset-v1: Add missing support for cpuset_v2_mode
[ Upstream commit 1bf67c8fdbda21fadd564a12dbe2b13c1ea5eda7 ] Android has mounted the v1 cpuset controller using filesystem type "cpuset" (not "cgroup") since 2015 [1], and depends on the resulting behavior where the controller name is not added as a prefix for cgroupfs files. [2] Later, a problem was discovered where cpu hotplug onlining did not affect the cpuset/cpus files, which Android carried an out-of-tree patch to address for a while. An attempt was made to upstream this patch, but the recommendation was to use the "cpuset_v2_mode" mount option instead. [3] An effort was made to do so, but this fails with "cgroup: Unknown parameter 'cpuset_v2_mode'" because commite1cba4b85d("cgroup: Add mount flag to enable cpuset to use v2 behavior in v1 cgroup") did not update the special cased cpuset_mount(), and only the cgroup (v1) filesystem type was updated. Add parameter parsing to the cpuset filesystem type so that cpuset_v2_mode works like the cgroup filesystem type: $ mkdir /dev/cpuset $ mount -t cpuset -ocpuset_v2_mode none /dev/cpuset $ mount|grep cpuset none on /dev/cpuset type cgroup (rw,relatime,cpuset,noprefix,cpuset_v2_mode,release_agent=/sbin/cpuset_release_agent) [1] https://cs.android.com/android/_/android/platform/system/core/+/b769c8d24fd7be96f8968aa4c80b669525b930d3 [2] https://cs.android.com/android/platform/superproject/main/+/main:system/core/libprocessgroup/setup/cgroup_map_write.cpp;drc=2dac5d89a0f024a2d0cc46a80ba4ee13472f1681;l=192 [3] https://lore.kernel.org/lkml/f795f8be-a184-408a-0b5a-553d26061385@redhat.com/T/ Fixes:e1cba4b85d("cgroup: Add mount flag to enable cpuset to use v2 behavior in v1 cgroup") Signed-off-by: T.J. Mercier <tjmercier@google.com> Acked-by: Waiman Long <longman@redhat.com> Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com> Acked-by: Michal Koutný <mkoutny@suse.com> Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
9a447f748f
commit
5d92e582d1
@@ -2339,9 +2339,37 @@ static struct file_system_type cgroup2_fs_type = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_CPUSETS_V1
|
#ifdef CONFIG_CPUSETS_V1
|
||||||
|
enum cpuset_param {
|
||||||
|
Opt_cpuset_v2_mode,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct fs_parameter_spec cpuset_fs_parameters[] = {
|
||||||
|
fsparam_flag ("cpuset_v2_mode", Opt_cpuset_v2_mode),
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int cpuset_parse_param(struct fs_context *fc, struct fs_parameter *param)
|
||||||
|
{
|
||||||
|
struct cgroup_fs_context *ctx = cgroup_fc2context(fc);
|
||||||
|
struct fs_parse_result result;
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
opt = fs_parse(fc, cpuset_fs_parameters, param, &result);
|
||||||
|
if (opt < 0)
|
||||||
|
return opt;
|
||||||
|
|
||||||
|
switch (opt) {
|
||||||
|
case Opt_cpuset_v2_mode:
|
||||||
|
ctx->flags |= CGRP_ROOT_CPUSET_V2_MODE;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct fs_context_operations cpuset_fs_context_ops = {
|
static const struct fs_context_operations cpuset_fs_context_ops = {
|
||||||
.get_tree = cgroup1_get_tree,
|
.get_tree = cgroup1_get_tree,
|
||||||
.free = cgroup_fs_context_free,
|
.free = cgroup_fs_context_free,
|
||||||
|
.parse_param = cpuset_parse_param,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2378,6 +2406,7 @@ static int cpuset_init_fs_context(struct fs_context *fc)
|
|||||||
static struct file_system_type cpuset_fs_type = {
|
static struct file_system_type cpuset_fs_type = {
|
||||||
.name = "cpuset",
|
.name = "cpuset",
|
||||||
.init_fs_context = cpuset_init_fs_context,
|
.init_fs_context = cpuset_init_fs_context,
|
||||||
|
.parameters = cpuset_fs_parameters,
|
||||||
.fs_flags = FS_USERNS_MOUNT,
|
.fs_flags = FS_USERNS_MOUNT,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user