|
@@ -82,32 +82,41 @@ void update_vsyscall_tz(void)
|
|
|
vsyscall_gtod_data.sys_tz = sys_tz;
|
|
|
}
|
|
|
|
|
|
-void update_vsyscall_old(struct timespec *wall_time, struct timespec *wtm,
|
|
|
- struct clocksource *clock, u32 mult)
|
|
|
+void update_vsyscall(struct timekeeper *tk)
|
|
|
{
|
|
|
- struct timespec monotonic;
|
|
|
+ struct vsyscall_gtod_data *vdata = &vsyscall_gtod_data;
|
|
|
|
|
|
- write_seqcount_begin(&vsyscall_gtod_data.seq);
|
|
|
+ write_seqcount_begin(&vdata->seq);
|
|
|
|
|
|
/* copy vsyscall data */
|
|
|
- vsyscall_gtod_data.clock.vclock_mode = clock->archdata.vclock_mode;
|
|
|
- vsyscall_gtod_data.clock.cycle_last = clock->cycle_last;
|
|
|
- vsyscall_gtod_data.clock.mask = clock->mask;
|
|
|
- vsyscall_gtod_data.clock.mult = mult;
|
|
|
- vsyscall_gtod_data.clock.shift = clock->shift;
|
|
|
-
|
|
|
- vsyscall_gtod_data.wall_time_sec = wall_time->tv_sec;
|
|
|
- vsyscall_gtod_data.wall_time_nsec = wall_time->tv_nsec;
|
|
|
+ vdata->clock.vclock_mode = tk->clock->archdata.vclock_mode;
|
|
|
+ vdata->clock.cycle_last = tk->clock->cycle_last;
|
|
|
+ vdata->clock.mask = tk->clock->mask;
|
|
|
+ vdata->clock.mult = tk->mult;
|
|
|
+ vdata->clock.shift = tk->shift;
|
|
|
+
|
|
|
+ vdata->wall_time_sec = tk->xtime_sec;
|
|
|
+ vdata->wall_time_snsec = tk->xtime_nsec;
|
|
|
+
|
|
|
+ vdata->monotonic_time_sec = tk->xtime_sec
|
|
|
+ + tk->wall_to_monotonic.tv_sec;
|
|
|
+ vdata->monotonic_time_snsec = tk->xtime_nsec
|
|
|
+ + (tk->wall_to_monotonic.tv_nsec
|
|
|
+ << tk->shift);
|
|
|
+ while (vdata->monotonic_time_snsec >=
|
|
|
+ (((u64)NSEC_PER_SEC) << tk->shift)) {
|
|
|
+ vdata->monotonic_time_snsec -=
|
|
|
+ ((u64)NSEC_PER_SEC) << tk->shift;
|
|
|
+ vdata->monotonic_time_sec++;
|
|
|
+ }
|
|
|
|
|
|
- monotonic = timespec_add(*wall_time, *wtm);
|
|
|
- vsyscall_gtod_data.monotonic_time_sec = monotonic.tv_sec;
|
|
|
- vsyscall_gtod_data.monotonic_time_nsec = monotonic.tv_nsec;
|
|
|
+ vdata->wall_time_coarse.tv_sec = tk->xtime_sec;
|
|
|
+ vdata->wall_time_coarse.tv_nsec = (long)(tk->xtime_nsec >> tk->shift);
|
|
|
|
|
|
- vsyscall_gtod_data.wall_time_coarse = __current_kernel_time();
|
|
|
- vsyscall_gtod_data.monotonic_time_coarse =
|
|
|
- timespec_add(vsyscall_gtod_data.wall_time_coarse, *wtm);
|
|
|
+ vdata->monotonic_time_coarse = timespec_add(vdata->wall_time_coarse,
|
|
|
+ tk->wall_to_monotonic);
|
|
|
|
|
|
- write_seqcount_end(&vsyscall_gtod_data.seq);
|
|
|
+ write_seqcount_end(&vdata->seq);
|
|
|
}
|
|
|
|
|
|
static void warn_bad_vsyscall(const char *level, struct pt_regs *regs,
|