From: Guangyu Sun Date: Thu, 4 Oct 2012 22:46:56 +0000 (-0700) Subject: Revert "hrtimer: Update hrtimer base offsets each hrtimer_interrupt" X-Git-Tag: v2.6.39-400.9.0~303^2~24 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=bdb1ba44f570c9729afbae92225f525fb6ea1a51;p=users%2Fjedix%2Flinux-maple.git Revert "hrtimer: Update hrtimer base offsets each hrtimer_interrupt" This reverts commit e5f24110402047b80191e280ba54cf0c6d346f7c. Signed-off-by: Guangyu Sun --- diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 957869fd596a6..8fc65334191e8 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -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;