timers: Fix slack calculation for expired timers
authorJeff Chua <jeff.chua.linux@gmail.com>
Sun, 23 May 2010 23:16:24 +0000 (07:16 +0800)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 24 May 2010 10:10:23 +0000 (12:10 +0200)
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>
kernel/timer.c

index 9199f3c5221526a1f7f60e52a33f7a6554cc0adf..be394af5bc22c9eee0e65953141cca231f001d9f 100644 (file)
@@ -750,13 +750,14 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires)
        unsigned long expires_limit, mask;
        int bit;
 
-       expires_limit = expires + timer->slack;
+       expires_limit = expires;
 
-       if (timer->slack < 0) /* auto slack: use 0.4% */
+       if (timer->slack > -1)
+               expires_limit = expires + timer->slack;
+       else if (time_after(expires, jiffies)) /* auto slack: use 0.4% */
                expires_limit = expires + (expires - jiffies)/256;
 
        mask = expires ^ expires_limit;
-
        if (mask == 0)
                return expires;