diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2014-07-16 17:05:04 -0400 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2014-07-23 18:01:49 -0400 |
commit | f519b1a2e08c913375324a927992bb328387f169 (patch) | |
tree | 0a4ccfd703fc4bed1da94cf9f1ed355f0eda0a60 /kernel/time | |
parent | 2044fdb03eb4e511d5028be0917899931f17461f (diff) |
timekeeping: Provide ktime_get_raw()
Provide a ktime_t based interface for raw monotonic time.
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 | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 118e91e3071c..af8051f4420d 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -305,6 +305,9 @@ static inline void tk_update_ktime_data(struct timekeeper *tk) | |||
305 | nsec *= NSEC_PER_SEC; | 305 | nsec *= NSEC_PER_SEC; |
306 | nsec += tk->wall_to_monotonic.tv_nsec; | 306 | nsec += tk->wall_to_monotonic.tv_nsec; |
307 | tk->base_mono = ns_to_ktime(nsec); | 307 | tk->base_mono = ns_to_ktime(nsec); |
308 | |||
309 | /* Update the monotonic raw base */ | ||
310 | tk->base_raw = timespec64_to_ktime(tk->raw_time); | ||
308 | } | 311 | } |
309 | 312 | ||
310 | /* must hold timekeeper_lock */ | 313 | /* must hold timekeeper_lock */ |
@@ -467,6 +470,27 @@ ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs) | |||
467 | EXPORT_SYMBOL_GPL(ktime_mono_to_any); | 470 | EXPORT_SYMBOL_GPL(ktime_mono_to_any); |
468 | 471 | ||
469 | /** | 472 | /** |
473 | * ktime_get_raw - Returns the raw monotonic time in ktime_t format | ||
474 | */ | ||
475 | ktime_t ktime_get_raw(void) | ||
476 | { | ||
477 | struct timekeeper *tk = &tk_core.timekeeper; | ||
478 | unsigned int seq; | ||
479 | ktime_t base; | ||
480 | s64 nsecs; | ||
481 | |||
482 | do { | ||
483 | seq = read_seqcount_begin(&tk_core.seq); | ||
484 | base = tk->base_raw; | ||
485 | nsecs = timekeeping_get_ns_raw(tk); | ||
486 | |||
487 | } while (read_seqcount_retry(&tk_core.seq, seq)); | ||
488 | |||
489 | return ktime_add_ns(base, nsecs); | ||
490 | } | ||
491 | EXPORT_SYMBOL_GPL(ktime_get_raw); | ||
492 | |||
493 | /** | ||
470 | * ktime_get_ts64 - get the monotonic clock in timespec64 format | 494 | * ktime_get_ts64 - get the monotonic clock in timespec64 format |
471 | * @ts: pointer to timespec variable | 495 | * @ts: pointer to timespec variable |
472 | * | 496 | * |
@@ -878,6 +902,7 @@ void __init timekeeping_init(void) | |||
878 | tk_set_xtime(tk, &now); | 902 | tk_set_xtime(tk, &now); |
879 | tk->raw_time.tv_sec = 0; | 903 | tk->raw_time.tv_sec = 0; |
880 | tk->raw_time.tv_nsec = 0; | 904 | tk->raw_time.tv_nsec = 0; |
905 | tk->base_raw.tv64 = 0; | ||
881 | if (boot.tv_sec == 0 && boot.tv_nsec == 0) | 906 | if (boot.tv_sec == 0 && boot.tv_nsec == 0) |
882 | boot = tk_xtime(tk); | 907 | boot = tk_xtime(tk); |
883 | 908 | ||