On 7/31/24 05:21, Chen Ridong wrote:
After commit 737bb142a00d ("cgroup/cpuset: Make cpuset.cpus.exclusive independent of cpuset.cpus"), cpuset.cpus.exclusive and cpuset.cpus became independent. However we found that cpuset.cpus.exclusive.effective is cleared when cpuset.cpus is clear. To fix this issue, just remove xcpus clearing when cpuset.cpus is being cleared. It can be reproduced as below: cd /sys/fs/cgroup/ mkdir test echo +cpuset > cgroup.subtree_control cd test echo 3 > cpuset.cpus.exclusive cat cpuset.cpus.exclusive.effective 3 echo > cpuset.cpus cat cpuset.cpus.exclusive.effective // was cleared Signed-off-by: Chen Ridong <chenridong@xxxxxxxxxx> --- kernel/cgroup/cpuset.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index a9b6d56eeffa..248c39bebbe9 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -2523,10 +2523,9 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, * that parsing. The validate_change() call ensures that cpusets * with tasks have cpus. */ - if (!*buf) { + if (!*buf) cpumask_clear(trialcs->cpus_allowed); - cpumask_clear(trialcs->effective_xcpus); - } else { + else { retval = cpulist_parse(buf, trialcs->cpus_allowed); if (retval < 0) return retval;
Yes, that is a corner case bug that has not been properly handled. Reviewed-by: Waiman Long <longman@xxxxxxxxxx>