x86/vdso: Introduce and use vgtod_ts
[linux-block.git] / arch / x86 / entry / vsyscall / vsyscall_gtod.c
index e1216dd95c04aa5cbaa6888a1d9f01d6246b21ce..31b9e5e0cfdf6b6aadb37e3cd975f85eec01a9b0 100644 (file)
@@ -31,6 +31,8 @@ void update_vsyscall(struct timekeeper *tk)
 {
        int vclock_mode = tk->tkr_mono.clock->archdata.vclock_mode;
        struct vsyscall_gtod_data *vdata = &vsyscall_gtod_data;
+       struct vgtod_ts *base;
+       u64 nsec;
 
        /* Mark the new vclock used. */
        BUILD_BUG_ON(VCLOCK_MAX >= 32);
@@ -45,34 +47,33 @@ void update_vsyscall(struct timekeeper *tk)
        vdata->mult             = tk->tkr_mono.mult;
        vdata->shift            = tk->tkr_mono.shift;
 
-       vdata->wall_time_sec            = tk->xtime_sec;
-       vdata->wall_time_snsec          = tk->tkr_mono.xtime_nsec;
+       base = &vdata->basetime[CLOCK_REALTIME];
+       base->sec = tk->xtime_sec;
+       base->nsec = tk->tkr_mono.xtime_nsec;
 
-       vdata->monotonic_time_sec       = tk->xtime_sec
-                                       + tk->wall_to_monotonic.tv_sec;
-       vdata->monotonic_time_snsec     = tk->tkr_mono.xtime_nsec
-                                       + ((u64)tk->wall_to_monotonic.tv_nsec
-                                               << tk->tkr_mono.shift);
-       while (vdata->monotonic_time_snsec >=
-                                       (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) {
-               vdata->monotonic_time_snsec -=
-                                       ((u64)NSEC_PER_SEC) << tk->tkr_mono.shift;
-               vdata->monotonic_time_sec++;
+       base = &vdata->basetime[CLOCK_MONOTONIC];
+       base->sec = tk->xtime_sec + tk->wall_to_monotonic.tv_sec;
+       nsec = tk->tkr_mono.xtime_nsec;
+       nsec += ((u64)tk->wall_to_monotonic.tv_nsec << tk->tkr_mono.shift);
+       while (nsec >= (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) {
+               nsec -= ((u64)NSEC_PER_SEC) << tk->tkr_mono.shift;
+               base->sec++;
        }
+       base->nsec = nsec;
 
-       vdata->wall_time_coarse_sec     = tk->xtime_sec;
-       vdata->wall_time_coarse_nsec    = (long)(tk->tkr_mono.xtime_nsec >>
-                                                tk->tkr_mono.shift);
+       base = &vdata->basetime[CLOCK_REALTIME_COARSE];
+       base->sec = tk->xtime_sec;
+       base->nsec = tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift;
 
-       vdata->monotonic_time_coarse_sec =
-               vdata->wall_time_coarse_sec + tk->wall_to_monotonic.tv_sec;
-       vdata->monotonic_time_coarse_nsec =
-               vdata->wall_time_coarse_nsec + tk->wall_to_monotonic.tv_nsec;
-
-       while (vdata->monotonic_time_coarse_nsec >= NSEC_PER_SEC) {
-               vdata->monotonic_time_coarse_nsec -= NSEC_PER_SEC;
-               vdata->monotonic_time_coarse_sec++;
+       base = &vdata->basetime[CLOCK_MONOTONIC_COARSE];
+       base->sec = tk->xtime_sec + tk->wall_to_monotonic.tv_sec;
+       nsec = tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift;
+       nsec += tk->wall_to_monotonic.tv_nsec;
+       while (nsec >= NSEC_PER_SEC) {
+               nsec -= NSEC_PER_SEC;
+               base->sec++;
        }
+       base->nsec = nsec;
 
        gtod_write_end(vdata);
 }