diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2008-10-17 04:04:34 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@apollo.(none)> | 2008-10-17 12:13:38 -0400 |
| commit | c34bec5a44e9486597d78e7a686b2f9088a0564c (patch) | |
| tree | dd538560814ea54ce8d3f46b935dd24127fba04e /kernel/time | |
| parent | 719254faa17ffedc87ba0fadb9b34e535c9758d5 (diff) | |
NOHZ: split tick_nohz_restart_sched_tick()
Split out the clock event device reprogramming. Preparatory
patch.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/time')
| -rw-r--r-- | kernel/time/tick-sched.c | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index fdcf3f93bb8d..7aedf4343539 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -377,6 +377,32 @@ ktime_t tick_nohz_get_sleep_length(void) | |||
| 377 | return ts->sleep_length; | 377 | return ts->sleep_length; |
| 378 | } | 378 | } |
| 379 | 379 | ||
| 380 | static void tick_nohz_restart(struct tick_sched *ts, ktime_t now) | ||
| 381 | { | ||
| 382 | hrtimer_cancel(&ts->sched_timer); | ||
| 383 | ts->sched_timer.expires = ts->idle_tick; | ||
| 384 | |||
| 385 | while (1) { | ||
| 386 | /* Forward the time to expire in the future */ | ||
| 387 | hrtimer_forward(&ts->sched_timer, now, tick_period); | ||
| 388 | |||
| 389 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) { | ||
| 390 | hrtimer_start(&ts->sched_timer, | ||
| 391 | ts->sched_timer.expires, | ||
| 392 | HRTIMER_MODE_ABS); | ||
| 393 | /* Check, if the timer was already in the past */ | ||
| 394 | if (hrtimer_active(&ts->sched_timer)) | ||
| 395 | break; | ||
| 396 | } else { | ||
| 397 | if (!tick_program_event(ts->sched_timer.expires, 0)) | ||
| 398 | break; | ||
| 399 | } | ||
| 400 | /* Update jiffies and reread time */ | ||
| 401 | tick_do_update_jiffies64(now); | ||
| 402 | now = ktime_get(); | ||
| 403 | } | ||
| 404 | } | ||
| 405 | |||
| 380 | /** | 406 | /** |
| 381 | * tick_nohz_restart_sched_tick - restart the idle tick from the idle task | 407 | * tick_nohz_restart_sched_tick - restart the idle tick from the idle task |
| 382 | * | 408 | * |
| @@ -430,28 +456,7 @@ void tick_nohz_restart_sched_tick(void) | |||
| 430 | */ | 456 | */ |
| 431 | ts->tick_stopped = 0; | 457 | ts->tick_stopped = 0; |
| 432 | ts->idle_exittime = now; | 458 | ts->idle_exittime = now; |
| 433 | hrtimer_cancel(&ts->sched_timer); | 459 | tick_nohz_restart(ts, now); |
| 434 | ts->sched_timer.expires = ts->idle_tick; | ||
| 435 | |||
| 436 | while (1) { | ||
| 437 | /* Forward the time to expire in the future */ | ||
| 438 | hrtimer_forward(&ts->sched_timer, now, tick_period); | ||
| 439 | |||
| 440 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) { | ||
| 441 | hrtimer_start(&ts->sched_timer, | ||
| 442 | ts->sched_timer.expires, | ||
| 443 | HRTIMER_MODE_ABS); | ||
| 444 | /* Check, if the timer was already in the past */ | ||
| 445 | if (hrtimer_active(&ts->sched_timer)) | ||
| 446 | break; | ||
| 447 | } else { | ||
| 448 | if (!tick_program_event(ts->sched_timer.expires, 0)) | ||
| 449 | break; | ||
| 450 | } | ||
| 451 | /* Update jiffies and reread time */ | ||
| 452 | tick_do_update_jiffies64(now); | ||
| 453 | now = ktime_get(); | ||
| 454 | } | ||
| 455 | local_irq_enable(); | 460 | local_irq_enable(); |
| 456 | } | 461 | } |
| 457 | 462 | ||
