X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=kernel%2Ftimer.c;h=2454172a80d3c6131313007d08f91f12eb85c107;hb=52b0ace7dfe8f70350218017a95d7cab1eb41fbb;hp=9199f3c5221526a1f7f60e52a33f7a6554cc0adf;hpb=04afb40593f9a3007e5ea817d009529ef10fb685;p=~andy%2Flinux diff --git a/kernel/timer.c b/kernel/timer.c index 9199f3c5221..2454172a80d 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -750,13 +750,18 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires) unsigned long expires_limit, mask; int bit; - expires_limit = expires + timer->slack; + expires_limit = expires; - if (timer->slack < 0) /* auto slack: use 0.4% */ - expires_limit = expires + (expires - jiffies)/256; + if (timer->slack >= 0) { + expires_limit = expires + timer->slack; + } else { + unsigned long 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; - if (mask == 0) return expires; @@ -1679,11 +1684,14 @@ static int __cpuinit timer_cpu_notify(struct notifier_block *self, unsigned long action, void *hcpu) { long cpu = (long)hcpu; + int err; + switch(action) { case CPU_UP_PREPARE: case CPU_UP_PREPARE_FROZEN: - if (init_timers_cpu(cpu) < 0) - return NOTIFY_BAD; + err = init_timers_cpu(cpu); + if (err < 0) + return notifier_from_errno(err); break; #ifdef CONFIG_HOTPLUG_CPU case CPU_DEAD: