diff options
| author | Robert Love <rml@tech9.net> | 2002-04-18 02:01:31 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@penguin.transmeta.com> | 2002-04-18 02:01:31 -0700 |
| commit | 5cfceb83ac4dcdb1ef319e2489d1ea28c40e322b (patch) | |
| tree | b41669665a791e5192c752c17b669c9b9df47cf2 /kernel | |
| parent | 4675eab8b8d3f0344f52dbc2511084739315152d (diff) | |
[PATCH] migration thread fix
Attached is a patch that disables interrupts while holding the rq_lock.
This is certainly needed to prevent a race against the timer tick, as
Erich Focht pointed out.
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index d9716a3ec8cd..78e60fe666d6 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -1782,9 +1782,11 @@ repeat: cpu_src = p->thread_info->cpu; rq_src = cpu_rq(cpu_src); + local_irq_save(flags); double_rq_lock(rq_src, rq_dest); if (p->thread_info->cpu != cpu_src) { double_rq_unlock(rq_src, rq_dest); + local_irq_restore(flags); goto repeat; } if (rq_src == rq) { @@ -1795,6 +1797,7 @@ repeat: } } double_rq_unlock(rq_src, rq_dest); + local_irq_restore(flags); up(&req->sem); } |
