* 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: posix_timer: Fix error path in timer_create hrtimer: Avoid double seqlock timers: Move local variable into else section timers: Fix slack calculation really
Showing the changes to kernel/timer.c (1 of 3 files). Show all
Unified · Split
| @@ -752,11 +752,15 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires) · 751 unmodified lines | |||
| 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; |