2021-01-07 05:44:41

by Li RongQing

[permalink] [raw]
Subject: [PATCH] alarmtimer: Do not mess with an enqueued hrtimer

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 <[email protected]>
---
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


2021-02-05 17:15:58

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [PATCH] alarmtimer: Do not mess with an enqueued hrtimer

On Thu, Jan 07 2021 at 13:33, Li RongQing wrote:
> 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")

I can't see what this fixes. alarm_restart() is only invoked when the
alarm has expired which means that the timer _cannot_ be queued.

Thanks,

tglx