Skip to content

Commit 09edea4

Browse files
nlynch-mentorRussell King
authored andcommitted
ARM: 8410/1: VDSO: fix coarse clock monotonicity regression
Since 906c555 ("timekeeping: Copy the shadow-timekeeper over the real timekeeper last") it has become possible on ARM to: - Obtain a CLOCK_MONOTONIC_COARSE or CLOCK_REALTIME_COARSE timestamp via syscall. - Subsequently obtain a timestamp for the same clock ID via VDSO which predates the first timestamp (by one jiffy). This is because ARM's update_vsyscall is deriving the coarse time using the __current_kernel_time interface, when it should really be using the timekeeper object provided to it by the timekeeping core. It happened to work before only because __current_kernel_time would access the same timekeeper object which had been passed to update_vsyscall. This is no longer the case. Cc: [email protected] Fixes: 906c555 ("timekeeping: Copy the shadow-timekeeper over the real timekeeper last") Signed-off-by: Nathan Lynch <[email protected]> Acked-by: Will Deacon <[email protected]> Signed-off-by: Russell King <[email protected]>
1 parent e83dd37 commit 09edea4

File tree

1 file changed

+3
-4
lines changed

1 file changed

+3
-4
lines changed

arch/arm/kernel/vdso.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,6 @@ static bool tk_is_cntvct(const struct timekeeper *tk)
296296
*/
297297
void update_vsyscall(struct timekeeper *tk)
298298
{
299-
struct timespec xtime_coarse;
300299
struct timespec64 *wtm = &tk->wall_to_monotonic;
301300

302301
if (!cntvct_ok) {
@@ -308,10 +307,10 @@ void update_vsyscall(struct timekeeper *tk)
308307

309308
vdso_write_begin(vdso_data);
310309

311-
xtime_coarse = __current_kernel_time();
312310
vdso_data->tk_is_cntvct = tk_is_cntvct(tk);
313-
vdso_data->xtime_coarse_sec = xtime_coarse.tv_sec;
314-
vdso_data->xtime_coarse_nsec = xtime_coarse.tv_nsec;
311+
vdso_data->xtime_coarse_sec = tk->xtime_sec;
312+
vdso_data->xtime_coarse_nsec = (u32)(tk->tkr_mono.xtime_nsec >>
313+
tk->tkr_mono.shift);
315314
vdso_data->wtm_clock_sec = wtm->tv_sec;
316315
vdso_data->wtm_clock_nsec = wtm->tv_nsec;
317316

0 commit comments

Comments
 (0)