Commit 9f6a3c60 authored by Anna-Maria Behnsen's avatar Anna-Maria Behnsen Committed by Thomas Gleixner
Browse files

timers: Split next timer interrupt logic



Split the logic for getting next timer interrupt (no matter of recalculated
or already stored in base->next_expiry) into a separate function named
next_timer_interrupt(). Make it available to local call sites only.

No functional change.

Signed-off-by: default avatarAnna-Maria Behnsen <anna-maria@linutronix.de>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Link: https://lore.kernel.org/r/20240221090548.36600-10-anna-maria@linutronix.de
parent af68cb3f
Loading
Loading
Loading
Loading
+19 −13
Original line number Diff line number Diff line
@@ -1996,12 +1996,29 @@ static u64 cmp_next_hrtimer_event(u64 basem, u64 expires)
	return DIV_ROUND_UP_ULL(nextevt, TICK_NSEC) * TICK_NSEC;
}

static unsigned long next_timer_interrupt(struct timer_base *base,
					  unsigned long basej)
{
	if (base->next_expiry_recalc)
		next_expiry_recalc(base);

	/*
	 * Move next_expiry for the empty base into the future to prevent an
	 * unnecessary raise of the timer softirq when the next_expiry value
	 * will be reached even if there is no timer pending.
	 */
	if (!base->timers_pending)
		base->next_expiry = basej + NEXT_TIMER_MAX_DELTA;

	return base->next_expiry;
}

static inline u64 __get_next_timer_interrupt(unsigned long basej, u64 basem,
					     bool *idle)
{
	struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]);
	unsigned long nextevt = basej + NEXT_TIMER_MAX_DELTA;
	u64 expires = KTIME_MAX;
	unsigned long nextevt;

	/*
	 * Pretend that there is no timer pending if the cpu is offline.
@@ -2014,24 +2031,13 @@ static inline u64 __get_next_timer_interrupt(unsigned long basej, u64 basem,
	}

	raw_spin_lock(&base->lock);
	if (base->next_expiry_recalc)
		next_expiry_recalc(base);
	nextevt = next_timer_interrupt(base, basej);

	if (base->timers_pending) {
		nextevt = base->next_expiry;

		/* If we missed a tick already, force 0 delta */
		if (time_before(nextevt, basej))
			nextevt = basej;
		expires = basem + (u64)(nextevt - basej) * TICK_NSEC;
	} else {
		/*
		 * Move next_expiry for the empty base into the future to
		 * prevent a unnecessary raise of the timer softirq when the
		 * next_expiry value will be reached even if there is no timer
		 * pending.
		 */
		base->next_expiry = nextevt;
	}

	/*