Re: [PATCH 12/14] vdso/gettimeofday: Add support for auxiliary clocks

From: Thomas Gleixner
Date: Sun Jul 06 2025 - 15:31:22 EST


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