提交 8e63d779 编写于 作者: T Thomas Gleixner

timers: Fix slack calculation really

commit f00e047e (timers: Fix slack calculation for expired timers)
fixed the issue of slack on expired timers only partially. Linus
noticed that jiffies is volatile so it is reloaded twice, which
generates bad code.

But its worse. This can defeat the time_after() check if jiffies are
incremented between time_after() and the slack calculation.

Fix it by reading jiffies into a local variable, which prevents the
compiler from loading it twice. While at it make the > -1 check into
>= 0 which is easier to read.
Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
上级 f16a5e34
...@@ -747,16 +747,19 @@ EXPORT_SYMBOL(mod_timer_pending); ...@@ -747,16 +747,19 @@ EXPORT_SYMBOL(mod_timer_pending);
static inline static inline
unsigned long apply_slack(struct timer_list *timer, unsigned long expires) unsigned long apply_slack(struct timer_list *timer, unsigned long expires)
{ {
unsigned long expires_limit, mask; unsigned long expires_limit, mask, now;
int bit; int bit;
expires_limit = expires; expires_limit = expires;
if (timer->slack > -1) if (timer->slack >= 0) {
expires_limit = expires + timer->slack; expires_limit = expires + timer->slack;
else if (time_after(expires, jiffies)) /* auto slack: use 0.4% */ } else {
expires_limit = expires + (expires - jiffies)/256; now = jiffies;
/* No slack, if already expired else auto slack 0.4% */
if (time_after(expires, now))
expires_limit = expires + (expires - now)/256;
}
mask = expires ^ expires_limit; mask = expires ^ expires_limit;
if (mask == 0) if (mask == 0)
return expires; return expires;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册