|
@@ -2188,6 +2188,48 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask)
|
|
mutex_unlock(&callback_mutex);
|
|
mutex_unlock(&callback_mutex);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int cpuset_cpus_allowed_fallback(struct task_struct *tsk)
|
|
|
|
+{
|
|
|
|
+ const struct cpuset *cs;
|
|
|
|
+ int cpu;
|
|
|
|
+
|
|
|
|
+ rcu_read_lock();
|
|
|
|
+ cs = task_cs(tsk);
|
|
|
|
+ if (cs)
|
|
|
|
+ cpumask_copy(&tsk->cpus_allowed, cs->cpus_allowed);
|
|
|
|
+ rcu_read_unlock();
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * We own tsk->cpus_allowed, nobody can change it under us.
|
|
|
|
+ *
|
|
|
|
+ * But we used cs && cs->cpus_allowed lockless and thus can
|
|
|
|
+ * race with cgroup_attach_task() or update_cpumask() and get
|
|
|
|
+ * the wrong tsk->cpus_allowed. However, both cases imply the
|
|
|
|
+ * subsequent cpuset_change_cpumask()->set_cpus_allowed_ptr()
|
|
|
|
+ * which takes task_rq_lock().
|
|
|
|
+ *
|
|
|
|
+ * If we are called after it dropped the lock we must see all
|
|
|
|
+ * changes in tsk_cs()->cpus_allowed. Otherwise we can temporary
|
|
|
|
+ * set any mask even if it is not right from task_cs() pov,
|
|
|
|
+ * the pending set_cpus_allowed_ptr() will fix things.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ cpu = cpumask_any_and(&tsk->cpus_allowed, cpu_active_mask);
|
|
|
|
+ if (cpu >= nr_cpu_ids) {
|
|
|
|
+ /*
|
|
|
|
+ * Either tsk->cpus_allowed is wrong (see above) or it
|
|
|
|
+ * is actually empty. The latter case is only possible
|
|
|
|
+ * if we are racing with remove_tasks_in_empty_cpuset().
|
|
|
|
+ * Like above we can temporary set any mask and rely on
|
|
|
|
+ * set_cpus_allowed_ptr() as synchronization point.
|
|
|
|
+ */
|
|
|
|
+ cpumask_copy(&tsk->cpus_allowed, cpu_possible_mask);
|
|
|
|
+ cpu = cpumask_any(cpu_active_mask);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return cpu;
|
|
|
|
+}
|
|
|
|
+
|
|
void cpuset_init_current_mems_allowed(void)
|
|
void cpuset_init_current_mems_allowed(void)
|
|
{
|
|
{
|
|
nodes_setall(current->mems_allowed);
|
|
nodes_setall(current->mems_allowed);
|