extern ktime_t ktime_get_real(void);
extern ktime_t ktime_get_boottime(void);
extern ktime_t ktime_get_monotonic_offset(void);
-extern void ktime_get_and_real_and_sleep_offset(ktime_t *monotonic,
- ktime_t *real_offset,
- ktime_t *sleep_offset);
DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
void hrtimer_interrupt(struct clock_event_device *dev)
{
struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases);
- ktime_t expires_next, now, entry_time, delta, real_offset, sleep_offset;
+ ktime_t expires_next, now, entry_time, delta;
int i, retries = 0;
BUG_ON(!cpu_base->hres_active);
cpu_base->nr_events++;
dev->next_event.tv64 = KTIME_MAX;
-
- ktime_get_and_real_and_sleep_offset(&now, &real_offset, &sleep_offset);
-
- entry_time = now;
+ entry_time = now = ktime_get();
retry:
expires_next.tv64 = KTIME_MAX;
raw_spin_lock(&cpu_base->lock);
-
- /* Update base offsets, to avoid early wakeups */
- cpu_base->clock_base[HRTIMER_BASE_REALTIME].offset = real_offset;
- cpu_base->clock_base[HRTIMER_BASE_BOOTTIME].offset = sleep_offset;
-
/*
* We set expires_next to KTIME_MAX here with cpu_base->lock
* held to prevent that a timer is enqueued in our queue via
* interrupt routine. We give it 3 attempts to avoid
* overreacting on some spurious event.
*/
- ktime_get_and_real_and_sleep_offset(&now, &real_offset, &sleep_offset);
+ now = ktime_get();
cpu_base->nr_retries++;
if (++retries < 3)
goto retry;
} while (read_seqretry(&xtime_lock, seq));
}
-/**
- * ktime_get_and_real_and_sleep_offset() - hrtimer helper, gets monotonic ktime,
- * realtime offset, and sleep offsets.
- */
-void ktime_get_and_real_and_sleep_offset(ktime_t *monotonic,
- ktime_t *real_offset,
- ktime_t *sleep_offset)
-{
- unsigned long seq;
- struct timespec wtom, sleep;
- u64 secs, nsecs;
-
- do {
- seq = read_seqbegin(&xtime_lock);
-
- secs = xtime.tv_sec +
- wall_to_monotonic.tv_sec;
- nsecs = xtime.tv_nsec +
- wall_to_monotonic.tv_nsec;
- nsecs += timekeeping_get_ns();
- /* If arch requires, add in gettimeoffset() */
- nsecs += arch_gettimeoffset();
-
- wtom = wall_to_monotonic;
- sleep = total_sleep_time;
- } while (read_seqretry(&xtime_lock, seq));
-
- *monotonic = ktime_add_ns(ktime_set(secs, 0), nsecs);
- set_normalized_timespec(&wtom, -wtom.tv_sec, -wtom.tv_nsec);
- *real_offset = timespec_to_ktime(wtom);
- *sleep_offset = timespec_to_ktime(sleep);
-}
-
-
/**
* ktime_get_monotonic_offset() - get wall_to_monotonic in ktime_t format
*/