forked from luck/tmp_suning_uos_patched
Two fixes for the generic VDSO code which missed 5.5:
- Make the update to the coarse timekeeper unconditional. This is required because the coarse timekeeper interfaces in the VDSO do not depend on a VDSO capable clocksource. If the system does not have a VDSO capable clocksource and the update is depending on the VDSO capable clocksource, the coarse VDSO interfaces would operate on stale data forever. - Invert the logic of __arch_update_vdso_data() to avoid further head scratching. Tripped over this several times while analyzing the update problem above. -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAl4vXzUTHHRnbHhAbGlu dXRyb25peC5kZQAKCRCmGPVMDXSYodbPD/4km+XOhsbefcn1Xo6SAQV9akPhKSHY h1gfjpe4UD+Uj4WfmpERHcCJA3sYtZSjNyEWkwagH1XjB+rcLc3JE8XvhPCZTXCx g/OQlww1ef6mBZ5nslpPUZs8i0HppoV7Sa955QxR/jWuOIEssg5c+XGqP8xX8AhX TqBOUcJd0LhqCGt76Gb6LHnOEshE8e6ptZ0xayzMZsab3LJTEaJCrsoDpADQ1q8A hMjiL3CG9/e12qKYhODFTbyc/wgyGQYK8g6sb9E1Twd2Tw2+ikRbtZuQd3HQv4jV SiVtmMqLu6IH+G608zeNIn/67/WX9zYqUZ3fZgSjBwXWoB84Gyj11KLnjmCgS6SH 0ddOQKPn8VyQc2anG4obRtMNB+TjJvGnB4QSL2ROJB7Zx6EYMsduhXwIbaNZDDro nIh6Xvl6iyb0lkhd9zCR7ak7UHJg4ECJsVKK3kAMIHJM4f53d/DwT+ZaHbJZa/2a OLoBGpBkJoE1X40dXou+0FUyUFRla42+ho99nCU580EyK/ZAuZEqKjjez9QIh4vN L/I6uEHGBw9myB40nb0DFhRIFR97BUkRTRA3VhyX0CYIE3gUL43zNFsdvcugsxRy 4/Cf7tqhQcSjYjJxpLTRRWt2t6QvDoWfTnrwiPqSepcO17uV8WHLrxK4mT2i8Vjc PIq7OgZlp09gQA== =ONO4 -----END PGP SIGNATURE----- Merge tag 'timers-urgent-2020-01-27' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull timer fixes from Thomas Gleixner: "Two fixes for the generic VDSO code which missed 5.5: - Make the update to the coarse timekeeper unconditional. This is required because the coarse timekeeper interfaces in the VDSO do not depend on a VDSO capable clocksource. If the system does not have a VDSO capable clocksource and the update is depending on the VDSO capable clocksource, the coarse VDSO interfaces would operate on stale data forever. - Invert the logic of __arch_update_vdso_data() to avoid further head scratching. Tripped over this several times while analyzing the update problem above" * tag 'timers-urgent-2020-01-27' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: lib/vdso: Update coarse timekeeper unconditionally lib/vdso: Make __arch_update_vdso_data() logic understandable
This commit is contained in:
commit
a56c41e5d7
|
@ -34,9 +34,9 @@ struct vdso_data *__arm_get_k_vdso_data(void)
|
|||
#define __arch_get_k_vdso_data __arm_get_k_vdso_data
|
||||
|
||||
static __always_inline
|
||||
int __arm_update_vdso_data(void)
|
||||
bool __arm_update_vdso_data(void)
|
||||
{
|
||||
return !cntvct_ok;
|
||||
return cntvct_ok;
|
||||
}
|
||||
#define __arch_update_vdso_data __arm_update_vdso_data
|
||||
|
||||
|
|
|
@ -12,9 +12,9 @@ static __always_inline struct vdso_data *__arch_get_k_vdso_data(void)
|
|||
#endif /* __arch_get_k_vdso_data */
|
||||
|
||||
#ifndef __arch_update_vdso_data
|
||||
static __always_inline int __arch_update_vdso_data(void)
|
||||
static __always_inline bool __arch_update_vdso_data(void)
|
||||
{
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
#endif /* __arch_update_vdso_data */
|
||||
|
||||
|
|
|
@ -28,11 +28,6 @@ static inline void update_vdso_data(struct vdso_data *vdata,
|
|||
vdata[CS_RAW].mult = tk->tkr_raw.mult;
|
||||
vdata[CS_RAW].shift = tk->tkr_raw.shift;
|
||||
|
||||
/* CLOCK_REALTIME */
|
||||
vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME];
|
||||
vdso_ts->sec = tk->xtime_sec;
|
||||
vdso_ts->nsec = tk->tkr_mono.xtime_nsec;
|
||||
|
||||
/* CLOCK_MONOTONIC */
|
||||
vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_MONOTONIC];
|
||||
vdso_ts->sec = tk->xtime_sec + tk->wall_to_monotonic.tv_sec;
|
||||
|
@ -70,12 +65,6 @@ static inline void update_vdso_data(struct vdso_data *vdata,
|
|||
vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_TAI];
|
||||
vdso_ts->sec = tk->xtime_sec + (s64)tk->tai_offset;
|
||||
vdso_ts->nsec = tk->tkr_mono.xtime_nsec;
|
||||
|
||||
/*
|
||||
* Read without the seqlock held by clock_getres().
|
||||
* Note: No need to have a second copy.
|
||||
*/
|
||||
WRITE_ONCE(vdata[CS_HRES_COARSE].hrtimer_res, hrtimer_resolution);
|
||||
}
|
||||
|
||||
void update_vsyscall(struct timekeeper *tk)
|
||||
|
@ -84,20 +73,17 @@ void update_vsyscall(struct timekeeper *tk)
|
|||
struct vdso_timestamp *vdso_ts;
|
||||
u64 nsec;
|
||||
|
||||
if (__arch_update_vdso_data()) {
|
||||
/*
|
||||
* Some architectures might want to skip the update of the
|
||||
* data page.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
/* copy vsyscall data */
|
||||
vdso_write_begin(vdata);
|
||||
|
||||
vdata[CS_HRES_COARSE].clock_mode = __arch_get_clock_mode(tk);
|
||||
vdata[CS_RAW].clock_mode = __arch_get_clock_mode(tk);
|
||||
|
||||
/* CLOCK_REALTIME also required for time() */
|
||||
vdso_ts = &vdata[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->sec = tk->xtime_sec;
|
||||
|
@ -110,7 +96,18 @@ void update_vsyscall(struct timekeeper *tk)
|
|||
nsec = nsec + tk->wall_to_monotonic.tv_nsec;
|
||||
vdso_ts->sec += __iter_div_u64_rem(nsec, NSEC_PER_SEC, &vdso_ts->nsec);
|
||||
|
||||
update_vdso_data(vdata, tk);
|
||||
/*
|
||||
* Read without the seqlock held by clock_getres().
|
||||
* Note: No need to have a second copy.
|
||||
*/
|
||||
WRITE_ONCE(vdata[CS_HRES_COARSE].hrtimer_res, hrtimer_resolution);
|
||||
|
||||
/*
|
||||
* Architectures can opt out of updating the high resolution part
|
||||
* of the VDSO.
|
||||
*/
|
||||
if (__arch_update_vdso_data())
|
||||
update_vdso_data(vdata, tk);
|
||||
|
||||
__arch_update_vsyscall(vdata, tk);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user