forked from Minki/linux
NOHZ: split tick_nohz_restart_sched_tick()
Split out the clock event device reprogramming. Preparatory patch. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
719254faa1
commit
c34bec5a44
@ -377,6 +377,32 @@ ktime_t tick_nohz_get_sleep_length(void)
|
|||||||
return ts->sleep_length;
|
return ts->sleep_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
|
||||||
|
{
|
||||||
|
hrtimer_cancel(&ts->sched_timer);
|
||||||
|
ts->sched_timer.expires = ts->idle_tick;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
/* Forward the time to expire in the future */
|
||||||
|
hrtimer_forward(&ts->sched_timer, now, tick_period);
|
||||||
|
|
||||||
|
if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
|
||||||
|
hrtimer_start(&ts->sched_timer,
|
||||||
|
ts->sched_timer.expires,
|
||||||
|
HRTIMER_MODE_ABS);
|
||||||
|
/* Check, if the timer was already in the past */
|
||||||
|
if (hrtimer_active(&ts->sched_timer))
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
if (!tick_program_event(ts->sched_timer.expires, 0))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Update jiffies and reread time */
|
||||||
|
tick_do_update_jiffies64(now);
|
||||||
|
now = ktime_get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tick_nohz_restart_sched_tick - restart the idle tick from the idle task
|
* tick_nohz_restart_sched_tick - restart the idle tick from the idle task
|
||||||
*
|
*
|
||||||
@ -430,28 +456,7 @@ void tick_nohz_restart_sched_tick(void)
|
|||||||
*/
|
*/
|
||||||
ts->tick_stopped = 0;
|
ts->tick_stopped = 0;
|
||||||
ts->idle_exittime = now;
|
ts->idle_exittime = now;
|
||||||
hrtimer_cancel(&ts->sched_timer);
|
tick_nohz_restart(ts, now);
|
||||||
ts->sched_timer.expires = ts->idle_tick;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
/* Forward the time to expire in the future */
|
|
||||||
hrtimer_forward(&ts->sched_timer, now, tick_period);
|
|
||||||
|
|
||||||
if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
|
|
||||||
hrtimer_start(&ts->sched_timer,
|
|
||||||
ts->sched_timer.expires,
|
|
||||||
HRTIMER_MODE_ABS);
|
|
||||||
/* Check, if the timer was already in the past */
|
|
||||||
if (hrtimer_active(&ts->sched_timer))
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
if (!tick_program_event(ts->sched_timer.expires, 0))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Update jiffies and reread time */
|
|
||||||
tick_do_update_jiffies64(now);
|
|
||||||
now = ktime_get();
|
|
||||||
}
|
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user