[PATCH v5 0/4] vdso: Keep the CLOCK_AUX base at full precision

Zhan Xusheng posted 4 patches 1 week, 2 days ago
include/vdso/math64.h   | 31 ++++++++++++++++++++++++++-----
kernel/time/vsyscall.c  | 26 ++++++++++----------------
lib/vdso/gettimeofday.c |  2 ++
3 files changed, 38 insertions(+), 21 deletions(-)
[PATCH v5 0/4] vdso: Keep the CLOCK_AUX base at full precision
Posted by Zhan Xusheng 1 week, 2 days ago
Patch 3/4 is the fix.  vdso_time_update_aux() rounds the CLOCK_AUX base
down to whole nanoseconds, so the vDSO reports 0 or 1 ns below
ktime_get_aux() for the same clock.  1/4 and 2/4 prepare the division
helper it uses.  4/4 is independent of the fix and can be dropped without
affecting the rest.

Changes since v4:

 - Every patch carries a single From: now.  format.from was set to a
   different address than user.email, so format-patch emitted a header
   From plus an in-body From, and send-email then added a second in-body
   one.  That setting is gone; git am records zhanxusheng@xiaomi.com for
   all four patches.

 - 1/4: rewrite the changelog, which referred to a loop it had not
   introduced.  Also put __iter_div_u64_rem()'s signature on one line, so
   that the two helpers in the file do not end up in different styles.

 - 2/4: put the __iter_div64_u64_rem() signature on one line, 90
   characters.  Rewrite the changelog and correct a size claim that did
   not survive re-measurement: the 16 bytes come from folding the two
   open-coded loops into one inlined helper, and the u32 return type makes
   no difference to vsyscall.o on x86-64.

 - 4/4: rewrite the subject and changelog using the wording the code uses
   for this.  "clock id dispatch" and "dispatch mask" were mine, not the
   kernel's.

 - 3/4 is unchanged.

 - The tag block follows the maintainer-tip.rst order now, which puts the
   author's Signed-off-by ahead of Reviewed-by.

Testing on x86-64: checkpatch --strict, gcc W=1 and make LLVM=1 are all
clean.  Built and booted with kernel/configs/x86_debug.config plus
panic_on_warn=1; no warning fired and the log holds no lockdep or
debug-object complaint.  A guest with an aux clock enabled saw no vDSO
reading ahead of a later ktime_get_aux() in 100000 samples at each of
offset 0, +5.123456789 and a negative offs_aux.

The generated code in vsyscall.o, vdso64 and vdso32 is byte-identical to
v4, so the reflowed lines changed nothing.

v4: https://lore.kernel.org/all/20260902033801.2912699-1-zhanxusheng@xiaomi.com

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 clockid fits into the u32 bitmask

 include/vdso/math64.h   | 31 ++++++++++++++++++++++++++-----
 kernel/time/vsyscall.c  | 26 ++++++++++----------------
 lib/vdso/gettimeofday.c |  2 ++
 3 files changed, 38 insertions(+), 21 deletions(-)


base-commit: 9b87fdc9af2fbfcdb5c24a64139685ef80f6573f
-- 
2.43.0