diff options
Diffstat (limited to 'kernel/timer.c')
| -rw-r--r-- | kernel/timer.c | 15 | 
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) | |||
| 749 | unsigned long expires_limit, mask; | 749 | unsigned long expires_limit, mask; | 
| 750 | int bit; | 750 | int bit; | 
| 751 | 751 | ||
| 752 | expires_limit = expires; | ||
| 753 | |||
| 754 | if (timer->slack >= 0) { | 752 | if (timer->slack >= 0) { | 
| 755 | expires_limit = expires + timer->slack; | 753 | expires_limit = expires + timer->slack; | 
| 756 | } else { | 754 | } else { | 
| 757 | unsigned long now = jiffies; | 755 | long delta = expires - jiffies; | 
| 756 | |||
| 757 | if (delta < 256) | ||
| 758 | return expires; | ||
| 758 | 759 | ||
| 759 | /* No slack, if already expired else auto slack 0.4% */ | 760 | expires_limit = expires + delta / 256; | 
| 760 | if (time_after(expires, now)) | ||
| 761 | expires_limit = expires + (expires - now)/256; | ||
| 762 | } | 761 | } | 
| 763 | mask = expires ^ expires_limit; | 762 | mask = expires ^ expires_limit; | 
| 764 | if (mask == 0) | 763 | if (mask == 0) | 
| @@ -795,6 +794,8 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires) | |||
| 795 | */ | 794 | */ | 
| 796 | int mod_timer(struct timer_list *timer, unsigned long expires) | 795 | int mod_timer(struct timer_list *timer, unsigned long expires) | 
| 797 | { | 796 | { | 
| 797 | expires = apply_slack(timer, expires); | ||
| 798 | |||
| 798 | /* | 799 | /* | 
| 799 | * This is a common optimization triggered by the | 800 | * This is a common optimization triggered by the | 
| 800 | * networking code - if the timer is re-modified | 801 | * networking code - if the timer is re-modified | 
| @@ -803,8 +804,6 @@ int mod_timer(struct timer_list *timer, unsigned long expires) | |||
| 803 | if (timer_pending(timer) && timer->expires == expires) | 804 | if (timer_pending(timer) && timer->expires == expires) | 
| 804 | return 1; | 805 | return 1; | 
| 805 | 806 | ||
| 806 | expires = apply_slack(timer, expires); | ||
| 807 | |||
| 808 | return __mod_timer(timer, expires, false, TIMER_NOT_PINNED); | 807 | return __mod_timer(timer, expires, false, TIMER_NOT_PINNED); | 
| 809 | } | 808 | } | 
| 810 | EXPORT_SYMBOL(mod_timer); | 809 | EXPORT_SYMBOL(mod_timer); | 
