aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/hrtimer.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index f78777abe769..e379ef0e9c20 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -1080,8 +1080,19 @@ static void run_hrtimer_pending(struct hrtimer_cpu_base *cpu_base)
1080 * If the timer was rearmed on another CPU, reprogram 1080 * If the timer was rearmed on another CPU, reprogram
1081 * the event device. 1081 * the event device.
1082 */ 1082 */
1083 if (timer->base->first == &timer->node) 1083 struct hrtimer_clock_base *base = timer->base;
1084 hrtimer_reprogram(timer, timer->base); 1084
1085 if (base->first == &timer->node &&
1086 hrtimer_reprogram(timer, base)) {
1087 /*
1088 * Timer is expired. Thus move it from tree to
1089 * pending list again.
1090 */
1091 __remove_hrtimer(timer, base,
1092 HRTIMER_STATE_PENDING, 0);
1093 list_add_tail(&timer->cb_entry,
1094 &base->cpu_base->cb_pending);
1095 }
1085 } 1096 }
1086 } 1097 }
1087 spin_unlock_irq(&cpu_base->lock); 1098 spin_unlock_irq(&cpu_base->lock);