On Tue, Jul 01 2025 at 10:58, Thomas Weißschuh wrote: > +static __always_inline > +bool do_aux(const struct vdso_time_data *vd, clockid_t clock, struct > __kernel_timespec *ts) > +{ > + const struct vdso_clock *vc; > + u64 sec, ns; > + u32 seq; > + u8 idx; > + > + if (!IS_ENABLED(CONFIG_POSIX_AUX_CLOCKS)) > + return false; > + > + idx = clock - CLOCK_AUX; > + vc = &vd->aux_clock_data[idx]; > + > + do { > + /* > + * Open coded function vdso_read_begin() to handle > + * VDSO_CLOCK_TIMENS. See comment in do_hres(). > + */ > + while ((seq = READ_ONCE(vc->seq)) & 1) { > + if (IS_ENABLED(CONFIG_TIME_NS) && vc->clock_mode == > VDSO_CLOCKMODE_TIMENS) { > + vd = __arch_get_vdso_u_timens_data(vd); > + vc = &vd->aux_clock_data[idx]; > + break;
This actually wants to be a continue because otherwise @seq contains the stale value from the initial read of the TIMENS page, which is 0x1. That's a pointless extra round through the below. With continue it re-reads, but this time the actual value from the time data page and also takes an eventual odd value into account properly. I fixed it up locally already. Thanks, tglx