|
@@ -550,6 +550,7 @@ static inline void run_hrtimer_queue(struct hrtimer_base *base)
|
|
fn = timer->function;
|
|
fn = timer->function;
|
|
data = timer->data;
|
|
data = timer->data;
|
|
set_curr_timer(base, timer);
|
|
set_curr_timer(base, timer);
|
|
|
|
+ timer->state = HRTIMER_RUNNING;
|
|
__remove_hrtimer(timer, base);
|
|
__remove_hrtimer(timer, base);
|
|
spin_unlock_irq(&base->lock);
|
|
spin_unlock_irq(&base->lock);
|
|
|
|
|
|
@@ -565,6 +566,10 @@ static inline void run_hrtimer_queue(struct hrtimer_base *base)
|
|
|
|
|
|
spin_lock_irq(&base->lock);
|
|
spin_lock_irq(&base->lock);
|
|
|
|
|
|
|
|
+ /* Another CPU has added back the timer */
|
|
|
|
+ if (timer->state != HRTIMER_RUNNING)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
if (restart == HRTIMER_RESTART)
|
|
if (restart == HRTIMER_RESTART)
|
|
enqueue_hrtimer(timer, base);
|
|
enqueue_hrtimer(timer, base);
|
|
else
|
|
else
|