aboutsummaryrefslogtreecommitdiffstats
path: root/arch/tile/kernel/time.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/tile/kernel/time.c')
-rw-r--r--arch/tile/kernel/time.c61
1 files changed, 40 insertions, 21 deletions
diff --git a/arch/tile/kernel/time.c b/arch/tile/kernel/time.c
index d8fbc289e680..c1b362277fb7 100644
--- a/arch/tile/kernel/time.c
+++ b/arch/tile/kernel/time.c
@@ -249,33 +249,52 @@ cycles_t ns2cycles(unsigned long nsecs)
249 249
250void update_vsyscall_tz(void) 250void update_vsyscall_tz(void)
251{ 251{
252 /* Userspace gettimeofday will spin while this value is odd. */ 252 write_seqcount_begin(&vdso_data->tz_seq);
253 ++vdso_data->tz_update_count;
254 smp_wmb();
255 vdso_data->tz_minuteswest = sys_tz.tz_minuteswest; 253 vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
256 vdso_data->tz_dsttime = sys_tz.tz_dsttime; 254 vdso_data->tz_dsttime = sys_tz.tz_dsttime;
257 smp_wmb(); 255 write_seqcount_end(&vdso_data->tz_seq);
258 ++vdso_data->tz_update_count;
259} 256}
260 257
261void update_vsyscall(struct timekeeper *tk) 258void update_vsyscall(struct timekeeper *tk)
262{ 259{
263 struct timespec *wtm = &tk->wall_to_monotonic; 260 if (tk->tkr.clock != &cycle_counter_cs)
264 struct clocksource *clock = tk->tkr.clock;
265
266 if (clock != &cycle_counter_cs)
267 return; 261 return;
268 262
269 /* Userspace gettimeofday will spin while this value is odd. */ 263 write_seqcount_begin(&vdso_data->tb_seq);
270 ++vdso_data->tb_update_count; 264
271 smp_wmb(); 265 vdso_data->cycle_last = tk->tkr.cycle_last;
272 vdso_data->xtime_tod_stamp = tk->tkr.cycle_last; 266 vdso_data->mask = tk->tkr.mask;
273 vdso_data->xtime_clock_sec = tk->xtime_sec; 267 vdso_data->mult = tk->tkr.mult;
274 vdso_data->xtime_clock_nsec = tk->tkr.xtime_nsec; 268 vdso_data->shift = tk->tkr.shift;
275 vdso_data->wtom_clock_sec = wtm->tv_sec; 269
276 vdso_data->wtom_clock_nsec = wtm->tv_nsec; 270 vdso_data->wall_time_sec = tk->xtime_sec;
277 vdso_data->mult = tk->tkr.mult; 271 vdso_data->wall_time_snsec = tk->tkr.xtime_nsec;
278 vdso_data->shift = tk->tkr.shift; 272
279 smp_wmb(); 273 vdso_data->monotonic_time_sec = tk->xtime_sec
280 ++vdso_data->tb_update_count; 274 + tk->wall_to_monotonic.tv_sec;
275 vdso_data->monotonic_time_snsec = tk->tkr.xtime_nsec
276 + ((u64)tk->wall_to_monotonic.tv_nsec
277 << tk->tkr.shift);
278 while (vdso_data->monotonic_time_snsec >=
279 (((u64)NSEC_PER_SEC) << tk->tkr.shift)) {
280 vdso_data->monotonic_time_snsec -=
281 ((u64)NSEC_PER_SEC) << tk->tkr.shift;
282 vdso_data->monotonic_time_sec++;
283 }
284
285 vdso_data->wall_time_coarse_sec = tk->xtime_sec;
286 vdso_data->wall_time_coarse_nsec = (long)(tk->tkr.xtime_nsec >>
287 tk->tkr.shift);
288
289 vdso_data->monotonic_time_coarse_sec =
290 vdso_data->wall_time_coarse_sec + tk->wall_to_monotonic.tv_sec;
291 vdso_data->monotonic_time_coarse_nsec =
292 vdso_data->wall_time_coarse_nsec + tk->wall_to_monotonic.tv_nsec;
293
294 while (vdso_data->monotonic_time_coarse_nsec >= NSEC_PER_SEC) {
295 vdso_data->monotonic_time_coarse_nsec -= NSEC_PER_SEC;
296 vdso_data->monotonic_time_coarse_sec++;
297 }
298
299 write_seqcount_end(&vdso_data->tb_seq);
281} 300}