Commit e939c913 authored by Ingo Molnar's avatar Ingo Molnar

[PATCH] another timer overflow thing

in add_timer_internal() we simply leave the timer pending forever if the
expiry is in more than 0xffffffff jiffies. This means more than 48 days on
eg. ia64 - which is not an unrealistic timeout. IIRC crond is happy to use
extremely large timeouts.

It's better to time out early (if you can call 48 days "early") than to
not time out at all.
parent f0a8aa74
...@@ -126,13 +126,17 @@ static void internal_add_timer(tvec_base_t *base, struct timer_list *timer) ...@@ -126,13 +126,17 @@ static void internal_add_timer(tvec_base_t *base, struct timer_list *timer)
* or you set a timer to go off in the past * or you set a timer to go off in the past
*/ */
vec = base->tv1.vec + (base->timer_jiffies & TVR_MASK); vec = base->tv1.vec + (base->timer_jiffies & TVR_MASK);
} else if (idx <= 0xffffffffUL) {
int i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
vec = base->tv5.vec + i;
} else { } else {
/* Can only get here on architectures with 64-bit jiffies */ int i;
INIT_LIST_HEAD(&timer->entry); /* If the timeout is larger than 0xffffffff on 64-bit
return; * architectures then we use the maximum timeout:
*/
if (idx > 0xffffffffUL) {
idx = 0xffffffffUL;
expires = idx + base->timer_jiffies;
}
i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
vec = base->tv5.vec + i;
} }
/* /*
* Timers are FIFO: * Timers are FIFO:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment