From: Guopeng Zhang <guopeng.zhang@linux.dev>
To: Waiman Long <longman@redhat.com>, tj@kernel.org
Cc: ridong.chen@linux.dev, hannes@cmpxchg.org, mkoutny@suse.com,
shuah@kernel.org, cgroups@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
Guopeng Zhang <zhangguopeng@kylinos.cn>
Subject: Re: [PATCH] cgroup/cpuset: Fix partition recovery with unavailable CPUs
Date: Thu, 22 Oct 2026 14:01:50 +0800 [thread overview]
Message-ID: <96d314a5-09b8-42f1-bed8-a5e755cda982@linux.dev> (raw)
In-Reply-To: <71bc8d63-456c-4dcb-9d03-c2881f41af78@redhat.com>
在 2026/10/22 11:31, Waiman Long 写道:
> On 10/20/26 9:33 AM, Guopeng Zhang wrote:
>> From: Guopeng Zhang <zhangguopeng@kylinos.cn>
>>
>> An invalid local partition can become valid again even when its
>> exclusive CPUs are no longer available from its parent.
>>
>> This can be reproduced on a cgroup v2 system with CPUs 0-7 online:
>>
>> cd /sys/fs/cgroup
>> echo +cpuset > cgroup.subtree_control
>> mkdir A
>> echo 1-4 > A/cpuset.cpus
>> echo 1-4 > A/cpuset.cpus.exclusive
>> echo root > A/cpuset.cpus.partition
>> echo +cpuset > A/cgroup.subtree_control
>> mkdir A/B
>> echo 3-4 > A/B/cpuset.cpus
>> echo 3-4 > A/B/cpuset.cpus.exclusive
>> echo root > A/B/cpuset.cpus.partition
>> echo 1-2 > A/cpuset.cpus.exclusive
>> cat A/B/cpuset.cpus.partition
>> root
>> cat A/B/cpuset.cpus.exclusive.effective
>> cat A/cpuset.cpus.effective
>> 1-2
>> cat A/B/cpuset.cpus.effective
>> 1-2
>>
>> B is changed back to a valid root even though its exclusive CPUs are
>> no longer available and cpuset.cpus.exclusive.effective is empty. B
>> should remain invalid until A can provide its exclusive CPUs again.
>>
>> Shrinking A's exclusive CPUs invalidates B in
>> compute_partition_effective_cpumask(). The subsequent walk in
>> update_cpumasks_hier() tries to recover B, but
>> update_parent_effective_cpumask() skips the recovery checks when xcpus
>> is not a subset of parent->effective_xcpus. Since part_error is still
>> zero, B is changed back to a valid partition.
>>
>> Set PERR_INVCPUS when the subset check fails so that the partition stays
>> invalid. New test cases are added to test_cpuset_prs.sh for removing and
>> restoring the parent's exclusive CPUs.
>>
>> Fixes: 0c7f293efc87 ("cgroup/cpuset: Add cpuset.cpus.exclusive.effective for v2")
>> Signed-off-by: Guopeng Zhang <zhangguopeng@kylinos.cn>
>> ---
>> kernel/cgroup/cpuset.c | 8 ++++++--
>> tools/testing/selftests/cgroup/test_cpuset_prs.sh | 4 ++++
>> 2 files changed, 10 insertions(+), 2 deletions(-)
>>
>> diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
>> index 585a982249ad..be80763953ed 100644
>> --- a/kernel/cgroup/cpuset.c
>> +++ b/kernel/cgroup/cpuset.c
>> @@ -1986,12 +1986,16 @@ static int update_parent_effective_cpumask(struct cpuset *cs, int cmd,
>> cpumask_copy(tmp->addmask, cs->effective_xcpus);
>> adding = true;
>> }
>> - } else if (is_partition_invalid(cs) && !cpumask_empty(xcpus) &&
>> - cpumask_subset(xcpus, parent->effective_xcpus)) {
>> + } else if (is_partition_invalid(cs) && !cpumask_empty(xcpus)) {
>> struct cgroup_subsys_state *css;
>> struct cpuset *child;
>> bool exclusive = true;
>> + if (!cpumask_subset(xcpus, parent->effective_xcpus)) {
>> + part_error = PERR_INVCPUS;
>> + goto write_error;
>> + }
>> +
>> /*
>> * Convert invalid partition to valid has to pass the
>> * cpu exclusivity test as well as the housekeeping
>> diff --git a/tools/testing/selftests/cgroup/test_cpuset_prs.sh b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
>> index d04aad697b96..f1d517647ade 100755
>> --- a/tools/testing/selftests/cgroup/test_cpuset_prs.sh
>> +++ b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
>> @@ -427,6 +427,10 @@ TEST_MATRIX=(
>> # cpuset.cpus is allowed, but those extra CPUs are ignored.
>> " C2-3:P1 C3:P1 . . . C2-4 . . 0 A1:|A2:2-3 A1:P1|A2:P1"
>> + # A child cannot recover until its exclusive CPUs are available again.
>> + " CX1-4:P1 CX3-4:P1 . . X1-2 . . . 0 A1:1-2|A2:1-2|XA2: A1:P1|A2:P-1"
>> + " CX1-4:P1 CX3-4:P1 . . X1-2:X1-4 . . . 0 A1:1-2|A2:3-4|XA2:3-4 A1:P1|A2:P1"
>> +
>> # Taking away all CPUs from parent or itself if there are tasks
>> # will make the partition invalid.
>> " C2-3:P1 C3:P1 . . T C2-3 . . 0 A1:2-3|A2:2-3 A1:P1|A2:P-1"
>
> Patch 2 of my series should fix this problem too. I do borrow your test cases in my patch. I hope you don't mind about it.
>
Thanks for addressing this issue as well.
Of course, I don't mind. Glad the test cases are useful!
Thanks,
Guopeng
prev parent reply other threads:[~2026-10-22 6:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-20 13:33 [PATCH] cgroup/cpuset: Fix partition recovery with unavailable CPUs Guopeng Zhang
2026-10-22 3:31 ` Waiman Long
2026-10-22 6:01 ` Guopeng Zhang [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=96d314a5-09b8-42f1-bed8-a5e755cda982@linux.dev \
--to=guopeng.zhang@linux.dev \
--cc=cgroups@vger.kernel.org \
--cc=hannes@cmpxchg.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=longman@redhat.com \
--cc=mkoutny@suse.com \
--cc=ridong.chen@linux.dev \
--cc=shuah@kernel.org \
--cc=tj@kernel.org \
--cc=zhangguopeng@kylinos.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.