diff options
Diffstat (limited to 'arch/tile/kernel/time.c')
-rw-r--r-- | arch/tile/kernel/time.c | 61 |
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 | ||
250 | void update_vsyscall_tz(void) | 250 | void 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 | ||
261 | void update_vsyscall(struct timekeeper *tk) | 258 | void 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 | } |