When running LTP's cpuset_memory_pressure program, the following error occurs: (1) Create a cgroup, enable cpuset subsystem, set memory limit, and then set cpuset_memory_pressure to 1 (2) In this cgroup, create a process to allocate a large amount of memory and generate pressure counts (3) Set cpuset_memory_pressure to 0 (4) Check cpuset.memory_pressure: LTP thinks it should be 0, but the current kernel returns a value of 1, so LTP determines it as FAIL V2: * call fmeter_init() when writing 0 to the memory_pressure_enabled Compared with patch v1 [1], this version implements clearer logic. [1] https://lore.kernel.org/cgroups/CA+B+MYRNsdKcYxC8kbyzVrdH9fT8c2if5UxGguKep36ZHe6HMQ@xxxxxxxxxxxxxx/T/#u Signed-off-by: Jin Guojie <guojie.jin@xxxxxxxxx> Suggested-by: Michal Koutný <mkoutny@xxxxxxxx> Suggested-by: Waiman Long <longman@xxxxxxxxxx> --- kernel/cgroup/cpuset-v1.c | 4 +++- kernel/cgroup/cpuset.c | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/kernel/cgroup/cpuset-v1.c b/kernel/cgroup/cpuset-v1.c index 25c1d7b77e2f..7520eb31598a 100644 --- a/kernel/cgroup/cpuset-v1.c +++ b/kernel/cgroup/cpuset-v1.c @@ -66,7 +66,6 @@ void fmeter_init(struct fmeter *fmp) fmp->cnt = 0; fmp->val = 0; fmp->time = 0; - spin_lock_init(&fmp->lock); } /* Internal meter update - process cnt events and update value */ @@ -437,6 +436,9 @@ static int cpuset_write_u64(struct cgroup_subsys_state *css, struct cftype *cft, break; case FILE_MEMORY_PRESSURE_ENABLED: cpuset_memory_pressure_enabled = !!val; + if (cpuset_memory_pressure_enabled == 0) { + fmeter_init(&cs->fmeter); + } break; case FILE_SPREAD_PAGE: retval = cpuset_update_flag(CS_SPREAD_PAGE, cs, val); diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 0f910c828973..3583c898ff77 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -3378,6 +3378,7 @@ cpuset_css_alloc(struct cgroup_subsys_state *parent_css) __set_bit(CS_SCHED_LOAD_BALANCE, &cs->flags); fmeter_init(&cs->fmeter); + spin_lock_init(&cs->fmeter.lock); cs->relax_domain_level = -1; INIT_LIST_HEAD(&cs->remote_sibling); @@ -3650,6 +3651,7 @@ int __init cpuset_init(void) nodes_setall(top_cpuset.effective_mems); fmeter_init(&top_cpuset.fmeter); + spin_lock_init(&top_cpuset.fmeter.lock); INIT_LIST_HEAD(&remote_children); BUG_ON(!alloc_cpumask_var(&cpus_attach, GFP_KERNEL)); -- 2.34.1