diff options
Diffstat (limited to 'kernel/timer.c')
-rw-r--r-- | kernel/timer.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/timer.c b/kernel/timer.c index e3b8c697bde4..2454172a80d3 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
@@ -752,11 +752,15 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires) | |||
752 | 752 | ||
753 | expires_limit = expires; | 753 | expires_limit = expires; |
754 | 754 | ||
755 | if (timer->slack > -1) | 755 | if (timer->slack >= 0) { |
756 | expires_limit = expires + timer->slack; | 756 | expires_limit = expires + timer->slack; |
757 | else if (time_after(expires, jiffies)) /* auto slack: use 0.4% */ | 757 | } else { |
758 | expires_limit = expires + (expires - jiffies)/256; | 758 | unsigned long now = jiffies; |
759 | 759 | ||
760 | /* No slack, if already expired else auto slack 0.4% */ | ||
761 | if (time_after(expires, now)) | ||
762 | expires_limit = expires + (expires - now)/256; | ||
763 | } | ||
760 | mask = expires ^ expires_limit; | 764 | mask = expires ^ expires_limit; |
761 | if (mask == 0) | 765 | if (mask == 0) |
762 | return expires; | 766 | return expires; |