arm64: VDSO: fix coarse clock monotonicity regression
Since 906c55579a
("timekeeping: Copy the shadow-timekeeper over the
real timekeeper last") it has become possible on arm64 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 arm64'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.
Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
f7644cbfcd
commit
878854a374
|
@ -199,16 +199,15 @@ up_fail:
|
||||||
*/
|
*/
|
||||||
void update_vsyscall(struct timekeeper *tk)
|
void update_vsyscall(struct timekeeper *tk)
|
||||||
{
|
{
|
||||||
struct timespec xtime_coarse;
|
|
||||||
u32 use_syscall = strcmp(tk->tkr_mono.clock->name, "arch_sys_counter");
|
u32 use_syscall = strcmp(tk->tkr_mono.clock->name, "arch_sys_counter");
|
||||||
|
|
||||||
++vdso_data->tb_seq_count;
|
++vdso_data->tb_seq_count;
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
|
|
||||||
xtime_coarse = __current_kernel_time();
|
|
||||||
vdso_data->use_syscall = use_syscall;
|
vdso_data->use_syscall = use_syscall;
|
||||||
vdso_data->xtime_coarse_sec = xtime_coarse.tv_sec;
|
vdso_data->xtime_coarse_sec = tk->xtime_sec;
|
||||||
vdso_data->xtime_coarse_nsec = xtime_coarse.tv_nsec;
|
vdso_data->xtime_coarse_nsec = tk->tkr_mono.xtime_nsec >>
|
||||||
|
tk->tkr_mono.shift;
|
||||||
vdso_data->wtm_clock_sec = tk->wall_to_monotonic.tv_sec;
|
vdso_data->wtm_clock_sec = tk->wall_to_monotonic.tv_sec;
|
||||||
vdso_data->wtm_clock_nsec = tk->wall_to_monotonic.tv_nsec;
|
vdso_data->wtm_clock_nsec = tk->wall_to_monotonic.tv_nsec;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue