summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorRobert Love <rml@tech9.net>2002-04-18 02:01:31 -0700
committerLinus Torvalds <torvalds@penguin.transmeta.com>2002-04-18 02:01:31 -0700
commit5cfceb83ac4dcdb1ef319e2489d1ea28c40e322b (patch)
treeb41669665a791e5192c752c17b669c9b9df47cf2 /kernel
parent4675eab8b8d3f0344f52dbc2511084739315152d (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.c3
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);
}