diff options
Diffstat (limited to 'kernel/time')
-rw-r--r-- | kernel/time/ntp.c | 2 | ||||
-rw-r--r-- | kernel/time/tick-broadcast.c | 17 | ||||
-rw-r--r-- | kernel/time/tick-sched.c | 28 |
3 files changed, 38 insertions, 9 deletions
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index cb25649c6f50..87aa5ff931e0 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -11,6 +11,8 @@ | |||
11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
12 | #include <linux/time.h> | 12 | #include <linux/time.h> |
13 | #include <linux/timex.h> | 13 | #include <linux/timex.h> |
14 | #include <linux/jiffies.h> | ||
15 | #include <linux/hrtimer.h> | ||
14 | 16 | ||
15 | #include <asm/div64.h> | 17 | #include <asm/div64.h> |
16 | #include <asm/timex.h> | 18 | #include <asm/timex.h> |
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index eadfce2fff74..8001d37071f5 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
@@ -243,11 +243,18 @@ void tick_broadcast_on_off(unsigned long reason, int *oncpu) | |||
243 | { | 243 | { |
244 | int cpu = get_cpu(); | 244 | int cpu = get_cpu(); |
245 | 245 | ||
246 | if (cpu == *oncpu) | 246 | if (!cpu_isset(*oncpu, cpu_online_map)) { |
247 | tick_do_broadcast_on_off(&reason); | 247 | printk(KERN_ERR "tick-braodcast: ignoring broadcast for " |
248 | else | 248 | "offline CPU #%d\n", *oncpu); |
249 | smp_call_function_single(*oncpu, tick_do_broadcast_on_off, | 249 | } else { |
250 | &reason, 1, 1); | 250 | |
251 | if (cpu == *oncpu) | ||
252 | tick_do_broadcast_on_off(&reason); | ||
253 | else | ||
254 | smp_call_function_single(*oncpu, | ||
255 | tick_do_broadcast_on_off, | ||
256 | &reason, 1, 1); | ||
257 | } | ||
251 | put_cpu(); | 258 | put_cpu(); |
252 | } | 259 | } |
253 | 260 | ||
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 3483e6cb9549..52db9e3c526e 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -167,9 +167,15 @@ void tick_nohz_stop_sched_tick(void) | |||
167 | goto end; | 167 | goto end; |
168 | 168 | ||
169 | cpu = smp_processor_id(); | 169 | cpu = smp_processor_id(); |
170 | if (unlikely(local_softirq_pending())) | 170 | if (unlikely(local_softirq_pending())) { |
171 | printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", | 171 | static int ratelimit; |
172 | local_softirq_pending()); | 172 | |
173 | if (ratelimit < 10) { | ||
174 | printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", | ||
175 | local_softirq_pending()); | ||
176 | ratelimit++; | ||
177 | } | ||
178 | } | ||
173 | 179 | ||
174 | now = ktime_get(); | 180 | now = ktime_get(); |
175 | /* | 181 | /* |
@@ -241,6 +247,21 @@ void tick_nohz_stop_sched_tick(void) | |||
241 | if (cpu == tick_do_timer_cpu) | 247 | if (cpu == tick_do_timer_cpu) |
242 | tick_do_timer_cpu = -1; | 248 | tick_do_timer_cpu = -1; |
243 | 249 | ||
250 | ts->idle_sleeps++; | ||
251 | |||
252 | /* | ||
253 | * delta_jiffies >= NEXT_TIMER_MAX_DELTA signals that | ||
254 | * there is no timer pending or at least extremly far | ||
255 | * into the future (12 days for HZ=1000). In this case | ||
256 | * we simply stop the tick timer: | ||
257 | */ | ||
258 | if (unlikely(delta_jiffies >= NEXT_TIMER_MAX_DELTA)) { | ||
259 | ts->idle_expires.tv64 = KTIME_MAX; | ||
260 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) | ||
261 | hrtimer_cancel(&ts->sched_timer); | ||
262 | goto out; | ||
263 | } | ||
264 | |||
244 | /* | 265 | /* |
245 | * calculate the expiry time for the next timer wheel | 266 | * calculate the expiry time for the next timer wheel |
246 | * timer | 267 | * timer |
@@ -248,7 +269,6 @@ void tick_nohz_stop_sched_tick(void) | |||
248 | expires = ktime_add_ns(last_update, tick_period.tv64 * | 269 | expires = ktime_add_ns(last_update, tick_period.tv64 * |
249 | delta_jiffies); | 270 | delta_jiffies); |
250 | ts->idle_expires = expires; | 271 | ts->idle_expires = expires; |
251 | ts->idle_sleeps++; | ||
252 | 272 | ||
253 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) { | 273 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) { |
254 | hrtimer_start(&ts->sched_timer, expires, | 274 | hrtimer_start(&ts->sched_timer, expires, |