[PATCH v4 0/4] vdso: Keep the CLOCK_AUX base at full precision
From: Zhan Xusheng
Date: Tue Sep 01 2026 - 23:38:14 EST
v3: https://lore.kernel.org/all/20260901020636.1821993-1-zhanxusheng@xxxxxxxxxx
Changes in v4:
- New 1/4 converts __iter_div_u64_rem() to OPTIMIZER_HIDE_VAR() as Thomas
asked, so the two helpers do not diverge. Measured on the x86 vDSO with
clang 18: vdso64 text -64 bytes, vdso32 -112. gcc 13 is unchanged.
Neither compiler turns the loop into a division with the new form,
checked at both widths.
- 2/4 uses the macro too and drops the comment about the memory
alternative.
- 2/4 no longer claims the vDSO cannot link a division. It cannot, but
this code is on the kernel side, so that was the wrong reason. The
reason the loop is right is that the quotient is never more than one,
which also answers David: there is nothing for a reciprocal multiply to
save.
- 3/4 drops the sentence about the advertised granularity, and says
instead that only the sub-second field changes.
- Continuation lines aligned under the opening paren.
- Picked up the Reviewed-by on 3/4.
Sorry about the pace of v2 and v3.
The problem 3/4 fixes: the CLOCK_AUX basetime is shifted down to
nanoseconds and back up, which drops the fractional nanoseconds of
xtime_nsec, so the vDSO floors the base and the cycle delta separately
where ktime_get_aux() floors their sum. The vDSO reading ends up 0 or 1 ns
below the syscall for the same clock.
Checked under QEMU with an auxiliary clock enabled through
/sys/kernel/time/aux_clocks/0/aux_clock_enable, comparing CLOCK_AUX via the
vDSO against the raw syscall at offset 0, at +5.123456789 s, and with
offs_aux driven negative. The two agree within read latency in all three,
and over 100000 interleaved pairs each the vDSO reading is never ahead of a
syscall reading taken after it. The 1 ns bias itself is not measurable
way, a pair of reads costing several hundred nanoseconds. The argument
for it is the algebra in 3/4, plus a sweep over (xtime_nsec, delta) which
puts the 1 ns case at 60% for shift 24.
Zhan Xusheng (4):
vdso/math64: Use OPTIMIZER_HIDE_VAR() in __iter_div_u64_rem()
vdso/math64: Add and use __iter_div64_u64_rem()
vdso/vsyscall: Keep the CLOCK_AUX base scaled
vdso/gettimeofday: Assert that the clock id fits the dispatch mask
include/vdso/math64.h | 29 ++++++++++++++++++++++++++---
kernel/time/vsyscall.c | 26 ++++++++++----------------
lib/vdso/gettimeofday.c | 2 ++
3 files changed, 38 insertions(+), 19 deletions(-)
base-commit: 89a312991dc6e638a36adc43ccb91dbc25504c04
--
2.43.0