|
@@ -479,7 +479,7 @@ static int validate_change(const struct cpuset *cur, const struct cpuset *trial)
|
|
|
*/
|
|
|
ret = -ENOSPC;
|
|
|
if ((cgroup_task_count(cur->css.cgroup) || cur->attach_in_progress) &&
|
|
|
- (cpumask_empty(trial->cpus_allowed) ||
|
|
|
+ (cpumask_empty(trial->cpus_allowed) &&
|
|
|
nodes_empty(trial->mems_allowed)))
|
|
|
goto out;
|
|
|
|
|
@@ -1466,8 +1466,13 @@ static int cpuset_can_attach(struct cgroup *cgrp, struct cgroup_taskset *tset)
|
|
|
|
|
|
mutex_lock(&cpuset_mutex);
|
|
|
|
|
|
+ /*
|
|
|
+ * We allow to move tasks into an empty cpuset if sane_behavior
|
|
|
+ * flag is set.
|
|
|
+ */
|
|
|
ret = -ENOSPC;
|
|
|
- if (cpumask_empty(cs->cpus_allowed) || nodes_empty(cs->mems_allowed))
|
|
|
+ if (!cgroup_sane_behavior(cgrp) &&
|
|
|
+ (cpumask_empty(cs->cpus_allowed) || nodes_empty(cs->mems_allowed)))
|
|
|
goto out_unlock;
|
|
|
|
|
|
cgroup_taskset_for_each(task, cgrp, tset) {
|