Patch "alarmtimer: Prevent overflow of relative timers" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
alarmtimer: Prevent overflow of relative timers
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
alarmtimer-prevent-overflow-of-relative-timers.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
f4781e76f90df7aec400635d73ea4c35ee1d4765Mon Sep 17 00:00:00 2001
From: Thomas Gleixner <[email protected]>
Date: Tue, 30 May 2017 23:15:34 +0200
Subject: alarmtimer: Prevent overflow of relative timers
From: Thomas Gleixner <[email protected]>
commit f4781e76f90df7aec400635d73ea4c35ee1d4765 upstream.
Andrey reported a alartimer related RCU stall while fuzzing the kernel with syzkaller.
The reason for this is an overflow in ktime_add() which brings the resulting time into negative space and causes immediate expiry of the timer. The following rearm with a small interval does not bring the timer back into positive space due to the same issue.
This results in a permanent firing alarmtimer which hogs the CPU.
Use ktime_add_safe() instead which detects the overflow and clamps the result to KTIME_SEC_MAX.
--- kernel/time/alarmtimer.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/time/alarmtimer.c +3 -3
@@ -339,7 +339,7 @@ void alarm_start_relative(struct alarm * {struct alarm_base *base = &alarm_bases[alarm->type]; - start =ktime_add (start, base->gettime ()); + start =ktime_add_safe (start, base->gettime ());alarm_start (alarm, start); }EXPORT_SYMBOL_GPL (alarm_start_relative);
@@ -425,7 +425,7 @@ u64 alarm_forward(struct alarm *alarm, k overrun++; } - alarm->node.expires =ktime_add (alarm->node.expires, interval); + alarm->node.expires =ktime_add_safe (alarm->node.expires, interval);return overrun; }EXPORT_SYMBOL_GPL (alarm_forward);
@@ -617,7 +617,7 @@ static int alarm_timer_set(struct k_itimktime_t now; now = alarm_bases[timr->it.alarm.alarmtimer.type].gettime (); - exp =ktime_add (now, exp); + exp =ktime_add_safe (now, exp); }alarm_start (&timr->it.alarm.alarmtimer, exp);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/genirq-release-resources-in-__setup_irq-error-path.patch queue-4.4/x86-mm-32-set-the-__vmalloc_start_set-flag-in-initmem_init.patch queue-4.4/alarmtimer-prevent-overflow-of-relative-timers.patch