mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-05 02:37:41 +00:00
vdso/vsyscall: Prepare 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. To prepare for the rework of the data structures, replace the struct vdso_time_data pointer with a struct vdso_clock pointer where applicable. No functional change. Signed-off-by: Anna-Maria Behnsen <anna-maria@linutronix.de> Signed-off-by: Nam Cao <namcao@linutronix.de> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/all/20250303-vdso-clock-v1-12-c1b5c69a166f@linutronix.de
This commit is contained in:
committed by
Thomas Gleixner
parent
80801972a1
commit
b5afbc106d
@@ -18,25 +18,26 @@
|
||||
static inline void update_vdso_time_data(struct vdso_time_data *vdata, struct timekeeper *tk)
|
||||
{
|
||||
struct vdso_timestamp *vdso_ts;
|
||||
struct vdso_clock *vc = vdata;
|
||||
u64 nsec, sec;
|
||||
|
||||
vdata[CS_HRES_COARSE].cycle_last = tk->tkr_mono.cycle_last;
|
||||
vc[CS_HRES_COARSE].cycle_last = tk->tkr_mono.cycle_last;
|
||||
#ifdef CONFIG_GENERIC_VDSO_OVERFLOW_PROTECT
|
||||
vdata[CS_HRES_COARSE].max_cycles = tk->tkr_mono.clock->max_cycles;
|
||||
vc[CS_HRES_COARSE].max_cycles = tk->tkr_mono.clock->max_cycles;
|
||||
#endif
|
||||
vdata[CS_HRES_COARSE].mask = tk->tkr_mono.mask;
|
||||
vdata[CS_HRES_COARSE].mult = tk->tkr_mono.mult;
|
||||
vdata[CS_HRES_COARSE].shift = tk->tkr_mono.shift;
|
||||
vdata[CS_RAW].cycle_last = tk->tkr_raw.cycle_last;
|
||||
vc[CS_HRES_COARSE].mask = tk->tkr_mono.mask;
|
||||
vc[CS_HRES_COARSE].mult = tk->tkr_mono.mult;
|
||||
vc[CS_HRES_COARSE].shift = tk->tkr_mono.shift;
|
||||
vc[CS_RAW].cycle_last = tk->tkr_raw.cycle_last;
|
||||
#ifdef CONFIG_GENERIC_VDSO_OVERFLOW_PROTECT
|
||||
vdata[CS_RAW].max_cycles = tk->tkr_raw.clock->max_cycles;
|
||||
vc[CS_RAW].max_cycles = tk->tkr_raw.clock->max_cycles;
|
||||
#endif
|
||||
vdata[CS_RAW].mask = tk->tkr_raw.mask;
|
||||
vdata[CS_RAW].mult = tk->tkr_raw.mult;
|
||||
vdata[CS_RAW].shift = tk->tkr_raw.shift;
|
||||
vc[CS_RAW].mask = tk->tkr_raw.mask;
|
||||
vc[CS_RAW].mult = tk->tkr_raw.mult;
|
||||
vc[CS_RAW].shift = tk->tkr_raw.shift;
|
||||
|
||||
/* CLOCK_MONOTONIC */
|
||||
vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_MONOTONIC];
|
||||
vdso_ts = &vc[CS_HRES_COARSE].basetime[CLOCK_MONOTONIC];
|
||||
vdso_ts->sec = tk->xtime_sec + tk->wall_to_monotonic.tv_sec;
|
||||
|
||||
nsec = tk->tkr_mono.xtime_nsec;
|
||||
@@ -54,7 +55,7 @@ static inline void update_vdso_time_data(struct vdso_time_data *vdata, struct ti
|
||||
nsec += (u64)tk->monotonic_to_boot.tv_nsec << tk->tkr_mono.shift;
|
||||
|
||||
/* CLOCK_BOOTTIME */
|
||||
vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_BOOTTIME];
|
||||
vdso_ts = &vc[CS_HRES_COARSE].basetime[CLOCK_BOOTTIME];
|
||||
vdso_ts->sec = sec;
|
||||
|
||||
while (nsec >= (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) {
|
||||
@@ -64,12 +65,12 @@ static inline void update_vdso_time_data(struct vdso_time_data *vdata, struct ti
|
||||
vdso_ts->nsec = nsec;
|
||||
|
||||
/* CLOCK_MONOTONIC_RAW */
|
||||
vdso_ts = &vdata[CS_RAW].basetime[CLOCK_MONOTONIC_RAW];
|
||||
vdso_ts = &vc[CS_RAW].basetime[CLOCK_MONOTONIC_RAW];
|
||||
vdso_ts->sec = tk->raw_sec;
|
||||
vdso_ts->nsec = tk->tkr_raw.xtime_nsec;
|
||||
|
||||
/* CLOCK_TAI */
|
||||
vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_TAI];
|
||||
vdso_ts = &vc[CS_HRES_COARSE].basetime[CLOCK_TAI];
|
||||
vdso_ts->sec = tk->xtime_sec + (s64)tk->tai_offset;
|
||||
vdso_ts->nsec = tk->tkr_mono.xtime_nsec;
|
||||
}
|
||||
@@ -78,6 +79,7 @@ void update_vsyscall(struct timekeeper *tk)
|
||||
{
|
||||
struct vdso_time_data *vdata = vdso_k_time_data;
|
||||
struct vdso_timestamp *vdso_ts;
|
||||
struct vdso_clock *vc = vdata;
|
||||
s32 clock_mode;
|
||||
u64 nsec;
|
||||
|
||||
@@ -85,21 +87,21 @@ void update_vsyscall(struct timekeeper *tk)
|
||||
vdso_write_begin(vdata);
|
||||
|
||||
clock_mode = tk->tkr_mono.clock->vdso_clock_mode;
|
||||
vdata[CS_HRES_COARSE].clock_mode = clock_mode;
|
||||
vdata[CS_RAW].clock_mode = clock_mode;
|
||||
vc[CS_HRES_COARSE].clock_mode = clock_mode;
|
||||
vc[CS_RAW].clock_mode = clock_mode;
|
||||
|
||||
/* CLOCK_REALTIME also required for time() */
|
||||
vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME];
|
||||
vdso_ts = &vc[CS_HRES_COARSE].basetime[CLOCK_REALTIME];
|
||||
vdso_ts->sec = tk->xtime_sec;
|
||||
vdso_ts->nsec = tk->tkr_mono.xtime_nsec;
|
||||
|
||||
/* CLOCK_REALTIME_COARSE */
|
||||
vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME_COARSE];
|
||||
vdso_ts = &vc[CS_HRES_COARSE].basetime[CLOCK_REALTIME_COARSE];
|
||||
vdso_ts->sec = tk->xtime_sec;
|
||||
vdso_ts->nsec = tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift;
|
||||
|
||||
/* CLOCK_MONOTONIC_COARSE */
|
||||
vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_MONOTONIC_COARSE];
|
||||
vdso_ts = &vc[CS_HRES_COARSE].basetime[CLOCK_MONOTONIC_COARSE];
|
||||
vdso_ts->sec = tk->xtime_sec + tk->wall_to_monotonic.tv_sec;
|
||||
nsec = tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift;
|
||||
nsec = nsec + tk->wall_to_monotonic.tv_nsec;
|
||||
|
||||
Reference in New Issue
Block a user