From 02fd23b0baf6f683e898927ed014cf7d0e8d5a90 Mon Sep 17 00:00:00 2001 From: Yong Zhang Date: Wed, 25 May 2011 16:20:17 +0800 Subject: [PATCH] timer: avoid recount slack for same-expire pending timer mod_timer has a optimized way for same-expire pending timer, but after we introduced slack, timer->expires will be recount based on timer->slack. So the current 'if (timer_pending(timer) && timer->expires == expires)' will be true only when 'timer->slack >= 0', but for the case where timer->slack is not defined explicitly, that check will fail sometimes. Reported-by: Sebastian Andrzej Siewior Signed-off-by: Yong Zhang Cc: Thomas Gleixner --- kernel/timer.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/kernel/timer.c b/kernel/timer.c index fd61986..73af53c 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -749,6 +749,10 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires) unsigned long expires_limit, mask; int bit; + /* no need to account slack again for a same-expire pending timer */ + if (timer_pending(timer) && time_after_eq(timer->expires, expires)) + return timer->expires; + expires_limit = expires; if (timer->slack >= 0) { @@ -795,6 +799,8 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires) */ int mod_timer(struct timer_list *timer, unsigned long expires) { + expires = apply_slack(timer, expires); + /* * This is a common optimization triggered by the * networking code - if the timer is re-modified @@ -803,8 +809,6 @@ int mod_timer(struct timer_list *timer, unsigned long expires) if (timer_pending(timer) && timer->expires == expires) return 1; - expires = apply_slack(timer, expires); - return __mod_timer(timer, expires, false, TIMER_NOT_PINNED); } EXPORT_SYMBOL(mod_timer); -- 1.7.4.1