diff options
author | Lin Ming <ming.m.lin@intel.com> | 2009-11-17 00:49:50 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2009-11-17 05:52:34 -0500 |
commit | 0696b711e4be45fa104c12329f617beb29c03f78 (patch) | |
tree | 96292fdc4ab443d6218077d363548532df6cbd8b /include/linux/clocksource.h | |
parent | a9366e61b03f55a6e009e687ad10e706714c9907 (diff) |
timekeeping: Fix clock_gettime vsyscall time warp
Since commit 0a544198 "timekeeping: Move NTP adjusted clock multiplier
to struct timekeeper" the clock multiplier of vsyscall is updated with
the unmodified clock multiplier of the clock source and not with the
NTP adjusted multiplier of the timekeeper.
This causes user space observerable time warps:
new CLOCK-warp maximum: 120 nsecs, 00000025c337c537 -> 00000025c337c4bf
Add a new argument "mult" to update_vsyscall() and hand in the
timekeeping internal NTP adjusted multiplier.
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Cc: "Zhang Yanmin" <yanmin_zhang@linux.intel.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Tony Luck <tony.luck@intel.com>
LKML-Reference: <1258436990.17765.83.camel@minggr.sh.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/linux/clocksource.h')
-rw-r--r-- | include/linux/clocksource.h | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 83d2fbd81b93..95e4995d9987 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h | |||
@@ -280,10 +280,12 @@ extern struct clocksource * __init __weak clocksource_default_clock(void); | |||
280 | extern void clocksource_mark_unstable(struct clocksource *cs); | 280 | extern void clocksource_mark_unstable(struct clocksource *cs); |
281 | 281 | ||
282 | #ifdef CONFIG_GENERIC_TIME_VSYSCALL | 282 | #ifdef CONFIG_GENERIC_TIME_VSYSCALL |
283 | extern void update_vsyscall(struct timespec *ts, struct clocksource *c); | 283 | extern void |
284 | update_vsyscall(struct timespec *ts, struct clocksource *c, u32 mult); | ||
284 | extern void update_vsyscall_tz(void); | 285 | extern void update_vsyscall_tz(void); |
285 | #else | 286 | #else |
286 | static inline void update_vsyscall(struct timespec *ts, struct clocksource *c) | 287 | static inline void |
288 | update_vsyscall(struct timespec *ts, struct clocksource *c, u32 mult) | ||
287 | { | 289 | { |
288 | } | 290 | } |
289 | 291 | ||