Instead of looping through all bases, find the active ones via the
cpu_base->active_bases bit field.

Signed-off-by: Thomas Gleixner <[email protected]>
---
 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to