@@ -1696,6 +1696,11 @@ void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags)
#ifdef CONFIG_SMP
+/* Must contain at least one active CPU */
+#ifndef arch_task_cpu_possible_mask
+#define arch_task_cpu_possible_mask(p) cpu_possible_mask
+#endif
+
/*
* Per-CPU kthreads are allowed to run on !active && online CPUs, see
* __set_cpus_allowed_ptr() and select_fallback_rq().
@@ -1708,7 +1713,10 @@ static inline bool is_cpu_allowed(struct task_struct *p, int cpu)
if (is_per_cpu_kthread(p))
return cpu_online(cpu);
- return cpu_active(cpu);
+ if (!cpu_active(cpu))
+ return false;
+
+ return cpumask_test_cpu(cpu, arch_task_cpu_possible_mask(p));
}
/*
@@ -2361,10 +2369,9 @@ static int select_fallback_rq(int cpu, struct task_struct *p)
}
fallthrough;
case possible:
- do_set_cpus_allowed(p, cpu_possible_mask);
+ do_set_cpus_allowed(p, arch_task_cpu_possible_mask(p));
state = fail;
break;
-
case fail:
BUG();
break;