diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 75ea00a668de..1f8ec2ae8762 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1928,6 +1928,7 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask, bool check) { const struct cpumask *cpu_valid_mask = cpu_active_mask; + const struct cpumask *cpu_allowed_mask = task_cpu_possible_mask(p); unsigned int dest_cpu; struct rq_flags rf; struct rq *rq; @@ -1941,6 +1942,9 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, * Kernel threads are allowed on online && !active CPUs */ cpu_valid_mask = cpu_online_mask; + } else if (!cpumask_subset(new_mask, cpu_allowed_mask)) { + ret = -EINVAL; + goto out; } /*