]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Revert "hrtimer: Update hrtimer base offsets each hrtimer_interrupt"
authorGuangyu Sun <guangyu.sun@oracle.com>
Thu, 4 Oct 2012 22:46:56 +0000 (15:46 -0700)
committerGuangyu Sun <guangyu.sun@oracle.com>
Thu, 4 Oct 2012 22:46:56 +0000 (15:46 -0700)
This reverts commit e5f24110402047b80191e280ba54cf0c6d346f7c.

Signed-off-by: Guangyu Sun <guangyu.sun@oracle.com>
kernel/hrtimer.c

index 957869fd596a67301fbd400997b9c01911ef4180..8fc65334191e8ad1e237390f93b759b427cd5225 100644 (file)
@@ -657,14 +657,6 @@ static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer,
        return 0;
 }
 
-static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base)
-{
-       ktime_t *offs_real = &base->clock_base[HRTIMER_BASE_REALTIME].offset;
-       ktime_t *offs_boot = &base->clock_base[HRTIMER_BASE_BOOTTIME].offset;
-
-       return ktime_get_update_offsets(offs_real, offs_boot);
-}
-
 /*
  * Retrigger next event is called after clock was set
  *
@@ -673,12 +665,22 @@ static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base)
 static void retrigger_next_event(void *arg)
 {
        struct hrtimer_cpu_base *base = &__get_cpu_var(hrtimer_bases);
+       struct timespec realtime_offset, xtim, wtm, sleep;
 
        if (!hrtimer_hres_active())
                return;
 
+       /* Optimized out for !HIGH_RES */
+       get_xtime_and_monotonic_and_sleep_offset(&xtim, &wtm, &sleep);
+       set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec);
+
+       /* Adjust CLOCK_REALTIME offset */
        raw_spin_lock(&base->lock);
-       hrtimer_update_base(base);
+       base->clock_base[HRTIMER_BASE_REALTIME].offset =
+               timespec_to_ktime(realtime_offset);
+       base->clock_base[HRTIMER_BASE_BOOTTIME].offset =
+               timespec_to_ktime(sleep);
+
        hrtimer_force_reprogram(base, 0);
        raw_spin_unlock(&base->lock);
 }
@@ -708,6 +710,7 @@ static int hrtimer_switch_to_hres(void)
                base->clock_base[i].resolution = KTIME_HIGH_RES;
 
        tick_setup_sched_timer();
+
        /* "Retrigger" the interrupt to get things going */
        retrigger_next_event(NULL);
        local_irq_restore(flags);
@@ -1261,7 +1264,7 @@ void hrtimer_interrupt(struct clock_event_device *dev)
        dev->next_event.tv64 = KTIME_MAX;
 
        raw_spin_lock(&cpu_base->lock);
-       entry_time = now = hrtimer_update_base(cpu_base);
+       entry_time = now = ktime_get();
 retry:
        expires_next.tv64 = KTIME_MAX;
        /*
@@ -1339,12 +1342,9 @@ retry:
         * We need to prevent that we loop forever in the hrtimer
         * interrupt routine. We give it 3 attempts to avoid
         * overreacting on some spurious event.
-        *
-        * Acquire base lock for updating the offsets and retrieving
-        * the current time.
         */
        raw_spin_lock(&cpu_base->lock);
-       now = hrtimer_update_base(cpu_base);
+       now = ktime_get();
        cpu_base->nr_retries++;
        if (++retries < 3)
                goto retry;