summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorDeepak Saxena <dsaxena@laptop.org>2008-07-30 10:30:53 -0700
committerDeepak Saxena <dsaxena@laptop.org>2008-07-30 10:30:53 -0700
commit85e8ce3752b87a20b329356e624c37a253586622 (patch)
treeda41eefe2871776be0586b33e013f30251a76765 /kernel
parenta3851e734bcee1b2342652057d084f0653e9d586 (diff)
parenta37912658a4844fa6a1bbf13873e394e15af47a9 (diff)
downloadlwn-85e8ce3752b87a20b329356e624c37a253586622.tar.gz
lwn-85e8ce3752b87a20b329356e624c37a253586622.zip
Merge commit 'v2.6.25.13' into olpc-testing
Diffstat (limited to 'kernel')
-rw-r--r--kernel/hrtimer.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index c15a359ea611..3d31d6529933 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -896,10 +896,18 @@ hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode)
*/
raise = timer->state == HRTIMER_STATE_PENDING;
+ /*
+ * We use preempt_disable to prevent this task from migrating after
+ * setting up the softirq and raising it. Otherwise, if me migrate
+ * we will raise the softirq on the wrong CPU.
+ */
+ preempt_disable();
+
unlock_hrtimer_base(timer, &flags);
if (raise)
hrtimer_raise_softirq();
+ preempt_enable();
return ret;
}