Instead of looping through all bases, find the active ones via the cpu_base->active_bases bit field. Signed-off-by: Thomas Gleixner --- kernel/hrtimer.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) Index: tip/kernel/hrtimer.c =================================================================== --- tip.orig/kernel/hrtimer.c +++ tip/kernel/hrtimer.c @@ -1284,7 +1284,8 @@ void hrtimer_interrupt(struct clock_even { struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); ktime_t expires_next, now, entry_time, delta; - int i, retries = 0; + unsigned long bases; + int retries = 0; BUG_ON(!cpu_base->hres_active); cpu_base->nr_events++; @@ -1302,16 +1303,18 @@ retry: * this CPU. */ cpu_base->expires_next.tv64 = KTIME_MAX; + bases = cpu_base->active_bases; - for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) { + while (bases) { struct hrtimer_clock_base *base; struct timerqueue_node *node; ktime_t basenow; + int idx; - if (!(cpu_base->active_bases & (1 << i))) - continue; + idx = __ffs(bases); + bases &= ~(1 << idx); - base = cpu_base->clock_base + i; + base = cpu_base->clock_base + idx; basenow = ktime_add(now, base->offset); while ((node = timerqueue_getnext(&base->active))) { @@ -1479,18 +1482,24 @@ void hrtimer_run_pending(void) */ void hrtimer_run_queues(void) { - struct timerqueue_node *node; struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); - struct hrtimer_clock_base *base; - int index, gettime = 1; + unsigned long bases; + int gettime = 1; if (hrtimer_hres_active()) return; - for (index = 0; index < HRTIMER_MAX_CLOCK_BASES; index++) { - base = &cpu_base->clock_base[index]; - if (!timerqueue_getnext(&base->active)) - continue; + bases = cpu_base->active_bases; + + while (bases) { + struct hrtimer_clock_base *base; + struct timerqueue_node *node; + int idx; + + idx = __ffs(bases); + bases &= ~(1 << idx); + + base = &cpu_base->clock_base[idx]; if (gettime) { hrtimer_get_softirq_time(cpu_base); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/