]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
timers: Split next timer interrupt logic
authorAnna-Maria Behnsen <anna-maria@linutronix.de>
Wed, 21 Feb 2024 09:05:37 +0000 (10:05 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 22 Feb 2024 16:52:31 +0000 (17:52 +0100)
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: Anna-Maria Behnsen <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Link: https://lore.kernel.org/r/20240221090548.36600-10-anna-maria@linutronix.de
kernel/time/timer.c

index 9c8443d4fe331dd43aa7e6b01e177d737eb242f8..748f4b72fb6dee504188a5e904ee1d132ac9c06a 100644 (file)
@@ -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;
        }
 
        /*