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