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

Thomas Gleixner tglx at linutronix.de
Sun Jul 6 12:31:08 PDT 2025


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



More information about the linux-arm-kernel mailing list