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 fd6198692b5..8cff36119e4 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -749,16 +749,15 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires)  	unsigned long expires_limit, mask;  	int bit; -	expires_limit = expires; -  	if (timer->slack >= 0) {  		expires_limit = expires + timer->slack;  	} else { -		unsigned long now = jiffies; +		long delta = expires - jiffies; + +		if (delta < 256) +			return expires; -		/* No slack, if already expired else auto slack 0.4% */ -		if (time_after(expires, now)) -			expires_limit = expires + (expires - now)/256; +		expires_limit = expires + delta / 256;  	}  	mask = expires ^ expires_limit;  	if (mask == 0) @@ -795,6 +794,8 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires)   */  int mod_timer(struct timer_list *timer, unsigned long expires)  { +	expires = apply_slack(timer, expires); +  	/*  	 * This is a common optimization triggered by the  	 * networking code - if the timer is re-modified @@ -803,8 +804,6 @@ int mod_timer(struct timer_list *timer, unsigned long expires)  	if (timer_pending(timer) && timer->expires == expires)  		return 1; -	expires = apply_slack(timer, expires); -  	return __mod_timer(timer, expires, false, TIMER_NOT_PINNED);  }  EXPORT_SYMBOL(mod_timer); | 
