arm: vdso: rename vdso_datapage variables
PATCH v5 1/12 arm: vdso: rename vdso_datapage variables
Take an effort to recode the arm64 vdso code from assembler to C previously submitted by Andrew Pinski <[email protected]>, rework it for use in both arm and arm64, overlapping any optimizations for each architecture. But instead of landing it in arm64, land the result into lib/vdso and unify both implementations to simplify future maintenance.
Rename seq_count to tb_seq_count. Rename tk_is_cntvct to use_syscall. Rename cs_mult to cs_mono_mult. All to align with the variables in the arm64 vdso datapage. Rework vdso_read_begin() and vdso_read_retry() functions to reflect modern access patterns for tb_seq_count field.
Update copyright message to reflect the start of the contributions in this series.
v2:
- split first CL into 1 of 7 pieces
v4:
- update commit message to reflect reasoning
v5:
- rebase
--- arch/arm/include/asm/vdso_datapage.h | 6 ++-- arch/arm/kernel/vdso.c | 17 +++++----- arch/arm/vdso/vgettimeofday.c | 61 +++++++++++++++++++----------------- 3 files changed, 45 insertions(+), 39 deletions(-)
arch/arm/include/asm/vdso_datapage.h +3 -3
@@ -29,8 +29,8 @@* 32 bytes. */ struct vdso_data { -u32 seq_count;/* sequence count - odd during updates */ -u16 tk_is_cntvct;/* fall back to syscall if false */ +u32 tb_seq_count;/* sequence count - odd during updates */ +u16 use_syscall;/* fall back to syscall if true */ u16 cs_shift;/* clocksource shift */ u32 xtime_coarse_sec;/* coarse time */ u32 xtime_coarse_nsec;
@@ -38,7 +38,7 @@ struct vdso_data {u32 wtm_clock_sec;/* wall to monotonic offset */ u32 wtm_clock_nsec;u32 xtime_clock_sec;/* CLOCK_REALTIME - seconds */ -u32 cs_mult;/* clocksource multiplier */ +u32 cs_mono_mult;/* clocksource multiplier */ u64 cs_cycle_last;/* last cycle value */ u64 cs_mask;/* clocksource mask */
arch/arm/kernel/vdso.c +9 -8
@@ -274,14 +274,14 @@ void arm_install_vdso(struct mm_struct *mm, unsigned long addr)static void vdso_write_begin (struct vdso_data *vdata) { - ++vdso_data->seq_count; + ++vdso_data->tb_seq_count;smp_wmb ();/* Pairs with smp_rmb in vdso_read_retry */ }static void vdso_write_end (struct vdso_data *vdata) {smp_wmb ();/* Pairs with smp_rmb in vdso_read_begin */ - ++vdso_data->seq_count; + ++vdso_data->tb_seq_count; }static bool tk_is_cntvct (const struct timekeeper *tk)
@@ -305,10 +305,10 @@ static bool tk_is_cntvct(const struct timekeeper *tk)* counter again, making it even, indicating to userspace that the * update is finished. * -* Userspace is expected to sample seq_count before reading any other -* fields from the data page. If seq_count is odd, userspace is +* Userspace is expected to sample tb_seq_count before reading any other +* fields from the data page. If tb_seq_count is odd, userspace is * expected to wait until it becomes even. After copying data from -* the page, userspace must sample seq_count again; if it has changed +* the page, userspace must sample tb_seq_count again; if it has changed * from its previous value, userspace must retry the whole sequence. * * Calls to update_vsyscall are serialized by the timekeeping core.
@@ -326,18 +326,19 @@ void update_vsyscall(struct timekeeper *tk)vdso_write_begin (vdso_data); - vdso_data->tk_is_cntvct =tk_is_cntvct (tk); + vdso_data->use_syscall = !tk_is_cntvct (tk); vdso_data->xtime_coarse_sec = tk->xtime_sec; vdso_data->xtime_coarse_nsec = (u32)(tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift); vdso_data->wtm_clock_sec = wtm->tv_sec; vdso_data->wtm_clock_nsec = wtm->tv_nsec; -if (vdso_data->tk_is_cntvct) { +if (!vdso_data->use_syscall) { vdso_data->cs_cycle_last = tk->tkr_mono.cycle_last; vdso_data->xtime_clock_sec = tk->xtime_sec; vdso_data->xtime_clock_snsec = tk->tkr_mono.xtime_nsec; - vdso_data->cs_mult = tk->tkr_mono.mult; + vdso_data->cs_mono_mult = tk->tkr_mono.mult; +/* tkr_mono.shift == tkr_raw.shift */ vdso_data->cs_shift = tk->tkr_mono.shift; vdso_data->cs_mask = tk->tkr_mono.mask; }
arch/arm/vdso/vgettimeofday.c +33 -28
104 lines not on this page · raw message
Signature · 1 line
2.15.0.403.gc27cc4dac6-goog