mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 12:21:22 -05:00
vdso/gettimeofday: Introduce vdso_set_timespec()
This code is duplicated and with the introduction of auxiliary clocks will be duplicated even more. Introduce a helper. Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/all/20250701-vdso-auxclock-v1-8-df7d9f87b9b8@linutronix.de
This commit is contained in:
committed by
Thomas Gleixner
parent
1a1cd5fe88
commit
381d96ccc1
@@ -77,6 +77,16 @@ static __always_inline bool vdso_clockid_valid(clockid_t clock)
|
||||
return likely((u32) clock < MAX_CLOCKS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Must not be invoked within the sequence read section as a race inside
|
||||
* that loop could result in __iter_div_u64_rem() being extremely slow.
|
||||
*/
|
||||
static __always_inline void vdso_set_timespec(struct __kernel_timespec *ts, u64 sec, u64 ns)
|
||||
{
|
||||
ts->tv_sec = sec + __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
|
||||
ts->tv_nsec = ns;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TIME_NS
|
||||
|
||||
#ifdef CONFIG_GENERIC_VDSO_DATA_STORE
|
||||
@@ -122,12 +132,7 @@ bool do_hres_timens(const struct vdso_time_data *vdns, const struct vdso_clock *
|
||||
sec += offs->sec;
|
||||
ns += offs->nsec;
|
||||
|
||||
/*
|
||||
* Do this outside the loop: a race inside the loop could result
|
||||
* in __iter_div_u64_rem() being extremely slow.
|
||||
*/
|
||||
ts->tv_sec = sec + __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
|
||||
ts->tv_nsec = ns;
|
||||
vdso_set_timespec(ts, sec, ns);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -188,12 +193,7 @@ bool do_hres(const struct vdso_time_data *vd, const struct vdso_clock *vc,
|
||||
sec = vdso_ts->sec;
|
||||
} while (unlikely(vdso_read_retry(vc, seq)));
|
||||
|
||||
/*
|
||||
* Do this outside the loop: a race inside the loop could result
|
||||
* in __iter_div_u64_rem() being extremely slow.
|
||||
*/
|
||||
ts->tv_sec = sec + __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
|
||||
ts->tv_nsec = ns;
|
||||
vdso_set_timespec(ts, sec, ns);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -223,12 +223,8 @@ bool do_coarse_timens(const struct vdso_time_data *vdns, const struct vdso_clock
|
||||
sec += offs->sec;
|
||||
nsec += offs->nsec;
|
||||
|
||||
/*
|
||||
* Do this outside the loop: a race inside the loop could result
|
||||
* in __iter_div_u64_rem() being extremely slow.
|
||||
*/
|
||||
ts->tv_sec = sec + __iter_div_u64_rem(nsec, NSEC_PER_SEC, &nsec);
|
||||
ts->tv_nsec = nsec;
|
||||
vdso_set_timespec(ts, sec, nsec);
|
||||
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user