diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/time/timekeeping.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index bfe3ea09afc9..86a92476c027 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -291,6 +291,26 @@ int pvclock_gtod_unregister_notifier(struct notifier_block *nb) | |||
| 291 | } | 291 | } |
| 292 | EXPORT_SYMBOL_GPL(pvclock_gtod_unregister_notifier); | 292 | EXPORT_SYMBOL_GPL(pvclock_gtod_unregister_notifier); |
| 293 | 293 | ||
| 294 | /* | ||
| 295 | * Update the ktime_t based scalar nsec members of the timekeeper | ||
| 296 | */ | ||
| 297 | static inline void tk_update_ktime_data(struct timekeeper *tk) | ||
| 298 | { | ||
| 299 | s64 nsec; | ||
| 300 | |||
| 301 | /* | ||
| 302 | * The xtime based monotonic readout is: | ||
| 303 | * nsec = (xtime_sec + wtm_sec) * 1e9 + wtm_nsec + now(); | ||
| 304 | * The ktime based monotonic readout is: | ||
| 305 | * nsec = base_mono + now(); | ||
| 306 | * ==> base_mono = (xtime_sec + wtm_sec) * 1e9 + wtm_nsec | ||
| 307 | */ | ||
| 308 | nsec = (s64)(tk->xtime_sec + tk->wall_to_monotonic.tv_sec); | ||
| 309 | nsec *= NSEC_PER_SEC; | ||
| 310 | nsec += tk->wall_to_monotonic.tv_nsec; | ||
| 311 | tk->base_mono = ns_to_ktime(nsec); | ||
| 312 | } | ||
| 313 | |||
| 294 | /* must hold timekeeper_lock */ | 314 | /* must hold timekeeper_lock */ |
| 295 | static void timekeeping_update(struct timekeeper *tk, unsigned int action) | 315 | static void timekeeping_update(struct timekeeper *tk, unsigned int action) |
| 296 | { | 316 | { |
| @@ -301,6 +321,8 @@ static void timekeeping_update(struct timekeeper *tk, unsigned int action) | |||
| 301 | update_vsyscall(tk); | 321 | update_vsyscall(tk); |
| 302 | update_pvclock_gtod(tk, action & TK_CLOCK_WAS_SET); | 322 | update_pvclock_gtod(tk, action & TK_CLOCK_WAS_SET); |
| 303 | 323 | ||
| 324 | tk_update_ktime_data(tk); | ||
| 325 | |||
| 304 | if (action & TK_MIRROR) | 326 | if (action & TK_MIRROR) |
| 305 | memcpy(&shadow_timekeeper, &tk_core.timekeeper, | 327 | memcpy(&shadow_timekeeper, &tk_core.timekeeper, |
| 306 | sizeof(tk_core.timekeeper)); | 328 | sizeof(tk_core.timekeeper)); |
