tile: Convert VDSO timekeeping to the precise mechanism
authorThomas Gleixner <tglx@linutronix.de>
Wed, 16 Jul 2014 21:03:49 +0000 (21:03 +0000)
committerJohn Stultz <john.stultz@linaro.org>
Wed, 23 Jul 2014 17:16:50 +0000 (10:16 -0700)
The code was only halfarsed converted to the new VSDO update mechanism
and still uses the inaccurate base value which lacks the fractional
part of xtime_nsec. Fix it up.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: John Stultz <john.stultz@linaro.org>
arch/tile/kernel/time.c
arch/tile/kernel/vdso/vgettimeofday.c

index 462dcd0..ae70155 100644 (file)
@@ -260,7 +260,6 @@ void update_vsyscall_tz(void)
 
 void update_vsyscall(struct timekeeper *tk)
 {
-       struct timespec wall_time = tk_xtime(tk);
        struct timespec *wtm = &tk->wall_to_monotonic;
        struct clocksource *clock = tk->clock;
 
@@ -271,12 +270,12 @@ void update_vsyscall(struct timekeeper *tk)
        ++vdso_data->tb_update_count;
        smp_wmb();
        vdso_data->xtime_tod_stamp = clock->cycle_last;
-       vdso_data->xtime_clock_sec = wall_time.tv_sec;
-       vdso_data->xtime_clock_nsec = wall_time.tv_nsec;
+       vdso_data->xtime_clock_sec = tk->xtime_sec;
+       vdso_data->xtime_clock_nsec = tk->xtime_nsec;
        vdso_data->wtom_clock_sec = wtm->tv_sec;
        vdso_data->wtom_clock_nsec = wtm->tv_nsec;
-       vdso_data->mult = clock->mult;
-       vdso_data->shift = clock->shift;
+       vdso_data->mult = tk->mult;
+       vdso_data->shift = tk->shift;
        smp_wmb();
        ++vdso_data->tb_update_count;
 }
index 51ec8e4..e933fb9 100644 (file)
@@ -83,10 +83,11 @@ int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
                if (count & 1)
                        continue;
 
-               cycles = (get_cycles() - vdso_data->xtime_tod_stamp);
-               ns = (cycles * vdso_data->mult) >> vdso_data->shift;
                sec = vdso_data->xtime_clock_sec;
-               ns += vdso_data->xtime_clock_nsec;
+               cycles = get_cycles() - vdso_data->xtime_tod_stamp;
+               ns = (cycles * vdso_data->mult) + vdso_data->xtime_clock_nsec;
+               ns >>= vdso_data->shift;
+
                if (ns >= NSEC_PER_SEC) {
                        ns -= NSEC_PER_SEC;
                        sec += 1;