Commit 83a2a6b8 authored by Anna-Maria Behnsen's avatar Anna-Maria Behnsen Committed by Thomas Gleixner
Browse files

vdso/gettimeofday: Prepare do_hres_timens() for introduction of struct vdso_clock



To support multiple PTP clocks, the VDSO data structure needs to be
reworked. All clock specific data will end up in struct vdso_clock and in
struct vdso_time_data there will be array of VDSO clocks. At the moment,
vdso_clock is simply a define which maps vdso_clock to vdso_time_data.

Prepare for the rework of these structures by adding a struct vdso_clock
pointer argument to do_hres_timens(), and replace the struct vdso_time_data
pointer with the new pointer argument where applicable.

No functional change.

Signed-off-by: default avatarAnna-Maria Behnsen <anna-maria@linutronix.de>
Signed-off-by: default avatarNam Cao <namcao@linutronix.de>
Signed-off-by: default avatarThomas Weißschuh <thomas.weissschuh@linutronix.de>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20250303-vdso-clock-v1-8-c1b5c69a166f@linutronix.de
parent 64c3613c
Loading
Loading
Loading
Loading
+18 −17
Original line number Diff line number Diff line
@@ -81,36 +81,36 @@ const struct vdso_time_data *__arch_get_vdso_u_timens_data(const struct vdso_tim
}
#endif /* CONFIG_GENERIC_VDSO_DATA_STORE */

static __always_inline int do_hres_timens(const struct vdso_time_data *vdns, clockid_t clk,
					  struct __kernel_timespec *ts)
static __always_inline
int do_hres_timens(const struct vdso_time_data *vdns, const struct vdso_clock *vcns,
		   clockid_t clk, struct __kernel_timespec *ts)
{
	const struct timens_offset *offs = &vdns->offset[clk];
	const struct vdso_time_data *vd = __arch_get_vdso_u_timens_data(vdns);
	const struct timens_offset *offs = &vcns->offset[clk];
	const struct vdso_timestamp *vdso_ts;
	const struct vdso_time_data *vd;
	const struct vdso_clock *vc = vd;
	u64 cycles, ns;
	u32 seq;
	s64 sec;

	vd = vdns - (clk == CLOCK_MONOTONIC_RAW ? CS_RAW : CS_HRES_COARSE);
	vd = __arch_get_vdso_u_timens_data(vd);
	if (clk != CLOCK_MONOTONIC_RAW)
		vd = &vd[CS_HRES_COARSE];
		vc = &vc[CS_HRES_COARSE];
	else
		vd = &vd[CS_RAW];
	vdso_ts = &vd->basetime[clk];
		vc = &vc[CS_RAW];
	vdso_ts = &vc->basetime[clk];

	do {
		seq = vdso_read_begin(vd);
		seq = vdso_read_begin(vc);

		if (unlikely(!vdso_clocksource_ok(vd)))
		if (unlikely(!vdso_clocksource_ok(vc)))
			return -1;

		cycles = __arch_get_hw_counter(vd->clock_mode, vd);
		cycles = __arch_get_hw_counter(vc->clock_mode, vd);
		if (unlikely(!vdso_cycles_ok(cycles)))
			return -1;
		ns = vdso_calc_ns(vd, cycles, vdso_ts->nsec);
		ns = vdso_calc_ns(vc, cycles, vdso_ts->nsec);
		sec = vdso_ts->sec;
	} while (unlikely(vdso_read_retry(vd, seq)));
	} while (unlikely(vdso_read_retry(vc, seq)));

	/* Add the namespace offset */
	sec += offs->sec;
@@ -132,8 +132,9 @@ const struct vdso_time_data *__arch_get_vdso_u_timens_data(const struct vdso_tim
	return NULL;
}

static __always_inline int do_hres_timens(const struct vdso_time_data *vdns, clockid_t clk,
					  struct __kernel_timespec *ts)
static __always_inline
int do_hres_timens(const struct vdso_time_data *vdns, const struct vdso_clock *vcns,
		   clockid_t clk, struct __kernel_timespec *ts)
{
	return -EINVAL;
}
@@ -166,7 +167,7 @@ int do_hres(const struct vdso_time_data *vd, const struct vdso_clock *vc,
		while (unlikely((seq = READ_ONCE(vc->seq)) & 1)) {
			if (IS_ENABLED(CONFIG_TIME_NS) &&
			    vc->clock_mode == VDSO_CLOCKMODE_TIMENS)
				return do_hres_timens(vd, clk, ts);
				return do_hres_timens(vd, vc, clk, ts);
			cpu_relax();
		}
		smp_rmb();