Prev: [123/197] fix NFS4 handling of mountpoint stat
Next: [131/197] [SCSI] fc class: fail fast bsg requests
From: Greg KH on 22 Apr 2010 15:50 2.6.32-stable review patch. If anyone has any objections, please let us know. ------------------ Based on commit e2912009fb7b715728311b0d8fe327a1432b3f79 upstream, but done differently as this issue is not present in .33 or .34 kernels due to rework in this area. If a task is in the TASK_WAITING state, then try_to_wake_up() is working on it, and it will place it on the correct cpu. This commit ensures that neither migrate_task() nor __migrate_task() calls set_task_cpu(p) while p is in the TASK_WAKING state. Otherwise, there could be two concurrent calls to set_task_cpu(p), resulting in the task's cfs_rq being inconsistent with its cpu. Signed-off-by: John Wright <john.wright(a)hp.com> Cc: Ingo Molnar <mingo(a)elte.hu> Cc: Peter Zijlstra <peterz(a)infradead.org> Signed-off-by: Greg Kroah-Hartman <gregkh(a)suse.de> --- kernel/sched.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) --- a/kernel/sched.c +++ b/kernel/sched.c @@ -2116,12 +2116,10 @@ migrate_task(struct task_struct *p, int /* * If the task is not on a runqueue (and not running), then - * it is sufficient to simply update the task's cpu field. + * the next wake-up will properly place the task. */ - if (!p->se.on_rq && !task_running(rq, p)) { - set_task_cpu(p, dest_cpu); + if (!p->se.on_rq && !task_running(rq, p)) return 0; - } init_completion(&req->done); req->task = p; @@ -7167,6 +7165,9 @@ static int __migrate_task(struct task_st /* Already moved. */ if (task_cpu(p) != src_cpu) goto done; + /* Waking up, don't get in the way of try_to_wake_up(). */ + if (p->state == TASK_WAKING) + goto fail; /* Affinity changed (again). */ if (!cpumask_test_cpu(dest_cpu, &p->cpus_allowed)) goto fail; -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |