diff options
Diffstat (limited to 'kernel/time/tick-sched.c')
-rw-r--r-- | kernel/time/tick-sched.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 86baa4f0dfe4..ee962d11107b 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -195,7 +195,7 @@ u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time) | |||
195 | * Called either from the idle loop or from irq_exit() when an idle period was | 195 | * Called either from the idle loop or from irq_exit() when an idle period was |
196 | * just interrupted by an interrupt which did not cause a reschedule. | 196 | * just interrupted by an interrupt which did not cause a reschedule. |
197 | */ | 197 | */ |
198 | void tick_nohz_stop_sched_tick(void) | 198 | void tick_nohz_stop_sched_tick(int inidle) |
199 | { | 199 | { |
200 | unsigned long seq, last_jiffies, next_jiffies, delta_jiffies, flags; | 200 | unsigned long seq, last_jiffies, next_jiffies, delta_jiffies, flags; |
201 | struct tick_sched *ts; | 201 | struct tick_sched *ts; |
@@ -224,6 +224,11 @@ void tick_nohz_stop_sched_tick(void) | |||
224 | if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE)) | 224 | if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE)) |
225 | goto end; | 225 | goto end; |
226 | 226 | ||
227 | if (!inidle && !ts->inidle) | ||
228 | goto end; | ||
229 | |||
230 | ts->inidle = 1; | ||
231 | |||
227 | if (need_resched()) | 232 | if (need_resched()) |
228 | goto end; | 233 | goto end; |
229 | 234 | ||
@@ -372,11 +377,14 @@ void tick_nohz_restart_sched_tick(void) | |||
372 | local_irq_disable(); | 377 | local_irq_disable(); |
373 | tick_nohz_stop_idle(cpu); | 378 | tick_nohz_stop_idle(cpu); |
374 | 379 | ||
375 | if (!ts->tick_stopped) { | 380 | if (!ts->inidle || !ts->tick_stopped) { |
381 | ts->inidle = 0; | ||
376 | local_irq_enable(); | 382 | local_irq_enable(); |
377 | return; | 383 | return; |
378 | } | 384 | } |
379 | 385 | ||
386 | ts->inidle = 0; | ||
387 | |||
380 | rcu_exit_nohz(); | 388 | rcu_exit_nohz(); |
381 | 389 | ||
382 | /* Update jiffies first */ | 390 | /* Update jiffies first */ |