On Sun, Dec 05, 2021 at 01:32:15PM -0500, Waiman Long wrote: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.
adding = deleting = false;So, given that this only happens with threaded domains, can we just not
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;
allow partitions within threaded domains? The combination doesn't make whole
lot of sense to me anyway.
+ /*And then we can avoid this extra restriction too, right?
+ * 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;