diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2014-07-16 17:04:10 -0400 |
|---|---|---|
| committer | John Stultz <john.stultz@linaro.org> | 2014-07-23 13:17:57 -0400 |
| commit | 7c032df5570388044b4efda3d9f4d2ffb96a3116 (patch) | |
| tree | ab8242028af30b3b914b8c33cdfe30fb2feca6c2 /kernel/time | |
| parent | f111adfdd7ff7d9fe54b6efa440b80824984749c (diff) | |
timekeeping: Provide internal ktime_t based data
The ktime_t based interfaces are used a lot in performance critical
code pathes. Add ktime_t based data so the interfaces don't have to
convert from the xtime/timespec based data.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'kernel/time')
| -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)); |
