diff options
Diffstat (limited to 'kernel/sched/core.c')
| -rw-r--r-- | kernel/sched/core.c | 13 | 
1 files changed, 12 insertions, 1 deletions
| diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 84b657f05625..ac05afbd982e 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1936,14 +1936,25 @@ static int migration_cpu_stop(void *data)  			complete = true;  		} -		if (dest_cpu < 0) +		if (dest_cpu < 0) { +			if (cpumask_test_cpu(task_cpu(p), &p->cpus_mask)) +				goto out; +  			dest_cpu = cpumask_any_distribute(&p->cpus_mask); +		}  		if (task_on_rq_queued(p))  			rq = __migrate_task(rq, &rf, p, dest_cpu);  		else  			p->wake_cpu = dest_cpu; +		/* +		 * XXX __migrate_task() can fail, at which point we might end +		 * up running on a dodgy CPU, AFAICT this can only happen +		 * during CPU hotplug, at which point we'll get pushed out +		 * anyway, so it's probably not a big deal. +		 */ +  	} else if (pending) {  		/*  		 * This happens when we get migrated between migrate_enable()'s | 
