On 12/13/21 15:45, Tejun Heo wrote:
On Sun, Dec 05, 2021 at 01:32:15PM -0500, Waiman Long wrote:
adding = deleting = false;
old_prs = new_prs = cpuset->partition_root_state;
if (cmd == partcmd_enable) {
+ /*
+ * Enabling partition root is not allowed if not all the CPUs
+ * can be granted from parent's effective_cpus.
+ */
+ if (!cpumask_subset(cpuset->cpus_allowed, parent->effective_cpus))
+ return -EINVAL;
+
+ /*
+ * A parent can be left with no CPU as long as there is no
+ * task directly associated with the parent partition. For
+ * such a parent, no new task can be moved into it.
+ */
+ if (partition_is_populated(parent, cpuset) &&
+ cpumask_equal(cpuset->cpus_allowed, parent->effective_cpus))
+ return -EINVAL;
So, given that this only happens with threaded domains, can we just not
allow partitions within threaded domains? The combination doesn't make whole
lot of sense to me anyway.
AFAICS, there are code in cpuset.c that disallows the an non-child node
to hold tasks, but the check doesn't cover all the possible cases. I
remembered that I was able to create such a scenario without using
threaded domains. That is why I put in this conditional check. It has
nothing to do with the use of threaded domains.
+ /*
+ * On default hierarchy, task cannot be moved to a cpuset with empty
+ * effective cpus.
+ */
+ if (is_in_v2_mode() && cpumask_empty(cs->effective_cpus))
+ goto out_unlock;
And then we can avoid this extra restriction too, right?
This check is supposed to prevent a task to be moved to a leaf cpuset
partition with just offlined cpus and hence no effective cpu. A possible
alternative is to force the partition to become invalid, but I think not
allowing the move is easier until one or more offlined cpus are onlined.
Cheers,
Longman