summaryrefslogtreecommitdiffstats
path: root/kernel/timer.c
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2011-06-14 05:53:42 -0700
committerTony Lindgren <tony@atomide.com>2011-06-14 05:53:42 -0700
commitb8ce9fb8e18af7466e0b915bb5979322cdace322 (patch)
treeeec6f9b58ce154fd863f0f78b374a697a5a7139b /kernel/timer.c
parentc8e0bf95fc01d6e2ca585fe08010800b6c56e823 (diff)
parente9e35c5a2b2c803b5e2f25906d8ffe110670ceb6 (diff)
downloadlinux-b8ce9fb8e18af7466e0b915bb5979322cdace322.tar.gz
linux-b8ce9fb8e18af7466e0b915bb5979322cdace322.tar.bz2
linux-b8ce9fb8e18af7466e0b915bb5979322cdace322.zip
Merge branch 'fixes-v3.0-rc3' into devel-fixes
Diffstat (limited to 'kernel/timer.c')
-rw-r--r--kernel/timer.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/kernel/timer.c b/kernel/timer.c
index fd6198692b57..8cff36119e4d 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -749,16 +749,15 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires)
unsigned long expires_limit, mask;
int bit;
- expires_limit = expires;
-
if (timer->slack >= 0) {
expires_limit = expires + timer->slack;
} else {
- unsigned long now = jiffies;
+ long delta = expires - jiffies;
+
+ if (delta < 256)
+ return expires;
- /* No slack, if already expired else auto slack 0.4% */
- if (time_after(expires, now))
- expires_limit = expires + (expires - now)/256;
+ expires_limit = expires + delta / 256;
}
mask = expires ^ expires_limit;
if (mask == 0)
@@ -795,6 +794,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 +804,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);