Re: [PATCH next] cpuset: Treat tasks in attaching process as populated
From: Waiman Long
Date: Tue Nov 11 2025 - 15:36:02 EST
On 11/11/25 2:25 PM, Michal Koutný wrote:
On Tue, Nov 11, 2025 at 10:16:33AM -0500, Waiman Long <llong@xxxxxxxxxx> wrote:
For internal helper like this one, we may not really need that asOK, cpuset_mutex and callback_lock are close but cgroup_is_populated()
almost all the code in cpuset.c are within either a cpuset_mutex or
callback_lock critical sections. So I am fine with or without it.
that caught my eye would also need cgroup_mutex otherwise "the result
can only be used as a hint" (quote from cgroup.h).
Or is it safe to assume that cpuset_mutex inside cpuset_attach() is
sufficient to always (incl. exits) ensure stability of
cgroup_is_populated() result?
Anyway, I'd find some clarifications in the commit message or the
surrounding code about this helpful. (Judgment call, whether with a
lockdep macro. My opinion is -- why not.)
For attach_in_progress, it is protected by the cpuset_mutex. So it may make sense to add a lockdep_assert_held() for that.
You are right that there are problems WRT the stability of cgroup_is_populated() value.
I think "cgrp->nr_populated_csets + cs->attach_in_progress" should be almost stable for the cgroup itself with cpuset_mutex, but there can be a small timing window after cpuset_attach(), but before the stat is updated where the sum is 0, but there are actually tasks in the cgroup.
For "cgrp->nr_populated_domain_children + cgrp->nr_populated_threaded_children", it also has the problem that the sum can be 0 but there are attach_in_progress set in one or more of the child cgroups. So even with this patch, we can't guarantee 100% that there can be no task in the partition even if it has empty effective_cpus. It is only a problem for nested local partitions though as remote partitions are not allowed to exhaust all the CPUs from root cgroup.
We should probably document that limitation to warn users if they try to create nested local partitions where the parent partition root of the child partitions has empty effective_cpus.
Cheers,
Longman