when an hrtimer is enqueued already, its expires should be not
changed, otherwise, this will corrupts the ordering of the
timerqueue RB tree, if other hrtimer is enqueued before this
hrtimer is restarted, whole RB tree is completely hosed

Fixes: 6cffe00f7d4e ("alarmtimer: Add functions for timerfd support")
Signed-off-by: Li RongQing <lirongq...@baidu.com>
---
 kernel/time/alarmtimer.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index f4ace1bf8382..3b34995ab8d2 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -388,8 +388,7 @@ void alarm_restart(struct alarm *alarm)
        unsigned long flags;
 
        spin_lock_irqsave(&base->lock, flags);
-       hrtimer_set_expires(&alarm->timer, alarm->node.expires);
-       hrtimer_restart(&alarm->timer);
+       hrtimer_start(&alarm->timer, alarm->node.expires, HRTIMER_MODE_ABS);
        alarmtimer_enqueue(base, alarm);
        spin_unlock_irqrestore(&base->lock, flags);
 }
-- 
2.17.3

Reply via email to