Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c34bec5a authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Thomas Gleixner
Browse files

NOHZ: split tick_nohz_restart_sched_tick()



Split out the clock event device reprogramming. Preparatory
patch.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 719254fa
Loading
Loading
Loading
Loading
+27 −22
Original line number Diff line number Diff line
@@ -377,6 +377,32 @@ ktime_t tick_nohz_get_sleep_length(void)
	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
 *
@@ -430,28 +456,7 @@ void tick_nohz_restart_sched_tick(void)
	 */
	ts->tick_stopped  = 0;
	ts->idle_exittime = 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(ts, now);
	local_irq_enable();
}