From 74782137f12dad1f1914d6c5cde4fb096584196d Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Thu, 3 Jul 2008 14:31:26 -0400 Subject: [PATCH] --- yaml --- r: 98644 b: refs/heads/master c: ee3ece830f6db9837f7ac67008f532a8c1e755f4 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/hrtimer.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 3aa9f4f8661b..1c23a347ea9d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6beef7eb0c16b5216814148b04838cfa963d2cb4 +refs/heads/master: ee3ece830f6db9837f7ac67008f532a8c1e755f4 diff --git a/trunk/kernel/hrtimer.c b/trunk/kernel/hrtimer.c index 421be5fe5cc7..ab80515008f4 100644 --- a/trunk/kernel/hrtimer.c +++ b/trunk/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; }