]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - kernel/hrtimer.c
hrtimers: Move lock held region in hrtimer_interrupt()
[karo-tx-linux.git] / kernel / hrtimer.c
index 3c24fb2c25c86ed99616b32c4ce68dbc24d85353..8f320af837b5c7b0368875dbe9cadd3c7e00a764 100644 (file)
@@ -1263,11 +1263,10 @@ void hrtimer_interrupt(struct clock_event_device *dev)
        cpu_base->nr_events++;
        dev->next_event.tv64 = KTIME_MAX;
 
+       raw_spin_lock(&cpu_base->lock);
        entry_time = now = ktime_get();
 retry:
        expires_next.tv64 = KTIME_MAX;
-
-       raw_spin_lock(&cpu_base->lock);
        /*
         * We set expires_next to KTIME_MAX here with cpu_base->lock
         * held to prevent that a timer is enqueued in our queue via
@@ -1344,6 +1343,7 @@ retry:
         * interrupt routine. We give it 3 attempts to avoid
         * overreacting on some spurious event.
         */
+       raw_spin_lock(&cpu_base->lock);
        now = ktime_get();
        cpu_base->nr_retries++;
        if (++retries < 3)
@@ -1356,6 +1356,7 @@ retry:
         */
        cpu_base->nr_hangs++;
        cpu_base->hang_detected = 1;
+       raw_spin_unlock(&cpu_base->lock);
        delta = ktime_sub(now, entry_time);
        if (delta.tv64 > cpu_base->max_hang_time.tv64)
                cpu_base->max_hang_time = delta;