X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=kernel%2Fhrtimer.c;h=ab80515008f4740fd980b1089d922811978ccff4;hb=6329d3021bcfa9038621e6e917d98929421d8ec8;hp=421be5fe5cc78f5d2be0eabd3ba2367fe1b15b3e;hpb=afa26be86b65a7183ceac29bdf1f51d6fc6932f0;p=linux-2.6 diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 421be5fe5c..ab80515008 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -1003,10 +1003,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; }