aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/timer.c
diff options
context:
space:
mode:
authorJeff Chua <jeff.chua.linux@gmail.com>2010-05-23 19:16:24 -0400
committerThomas Gleixner <tglx@linutronix.de>2010-05-24 06:10:23 -0400
commitf00e047efdf9d31c8a7dd7875b411f97cfa7d8e5 (patch)
tree4f6af8a7025480aa5d35e438acda9011526406ce /kernel/timer.c
parentbd45b7a385c5ffd82c11a1d51880be18559e5ad9 (diff)
timers: Fix slack calculation for expired timers
commit 3bbb9ec946 (timers: Introduce the concept of timer slack for legacy timers) does not take the case into account when the timer is already expired. This broke wireless drivers. The solution is not to apply slack to already expired timers. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Arjan van de Ven <arjan@linux.intel.com>
Diffstat (limited to 'kernel/timer.c')
-rw-r--r--kernel/timer.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/kernel/timer.c b/kernel/timer.c
index 9199f3c52215..be394af5bc22 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -750,13 +750,14 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires)
750 unsigned long expires_limit, mask; 750 unsigned long expires_limit, mask;
751 int bit; 751 int bit;
752 752
753 expires_limit = expires + timer->slack; 753 expires_limit = expires;
754 754
755 if (timer->slack < 0) /* auto slack: use 0.4% */ 755 if (timer->slack > -1)
756 expires_limit = expires + timer->slack;
757 else if (time_after(expires, jiffies)) /* auto slack: use 0.4% */
756 expires_limit = expires + (expires - jiffies)/256; 758 expires_limit = expires + (expires - jiffies)/256;
757 759
758 mask = expires ^ expires_limit; 760 mask = expires ^ expires_limit;
759
760 if (mask == 0) 761 if (mask == 0)
761 return expires; 762 return expires;
762 763