]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
hrtimer: Optimize for_each_active_base()
authorThomas Gleixner <tglx@kernel.org>
Tue, 24 Feb 2026 16:38:42 +0000 (17:38 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Fri, 27 Feb 2026 15:40:15 +0000 (16:40 +0100)
Give the compiler some help to emit way better code.

Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/20260224163431.599804894@kernel.org
kernel/time/hrtimer.c

index b0e7e29ade107d7c64d674138c70ada62e63e6d0..d1e58482e0a90e755149a6a39128396d33c702ec 100644 (file)
@@ -529,22 +529,10 @@ static inline void debug_activate(struct hrtimer *timer, enum hrtimer_mode mode,
        trace_hrtimer_start(timer, mode, was_armed);
 }
 
-static struct hrtimer_clock_base *
-__next_base(struct hrtimer_cpu_base *cpu_base, unsigned int *active)
-{
-       unsigned int idx;
-
-       if (!*active)
-               return NULL;
-
-       idx = __ffs(*active);
-       *active &= ~(1U << idx);
-
-       return &cpu_base->clock_base[idx];
-}
-
-#define for_each_active_base(base, cpu_base, active)           \
-       while ((base = __next_base((cpu_base), &(active))))
+#define for_each_active_base(base, cpu_base, active)                                   \
+       for (unsigned int idx = ffs(active); idx--; idx = ffs((active)))                \
+               for (bool done = false; !done; active &= ~(1U << idx))                  \
+                       for (base = &cpu_base->clock_base[idx]; !done; done = true)
 
 #if defined(CONFIG_NO_HZ_COMMON)
 /*