diff options
| author | John Stultz <john.stultz@linaro.org> | 2011-02-14 20:52:09 -0500 |
|---|---|---|
| committer | John Stultz <john.stultz@linaro.org> | 2011-02-21 15:53:05 -0500 |
| commit | abb3a4ea2e0ea7114a4475745da2f32bd9ad5b73 (patch) | |
| tree | ba78d928a1b58faf16c2507777b8430d54666f52 /kernel/time | |
| parent | e06383db9ec591696a06654257474b85bac1f8cb (diff) | |
time: Introduce get_monotonic_boottime and ktime_get_boottime
This adds new functions that return the monotonic time since boot
(in other words, CLOCK_MONOTONIC + suspend time).
CC: Jamie Lokier <jamie@shareable.org>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Alexander Shishkin <virtuoso@slind.org>
CC: Arve Hjønnevåg <arve@android.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'kernel/time')
| -rw-r--r-- | kernel/time/timekeeping.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 6262c1d18397..5fbd9aa7df95 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -907,7 +907,7 @@ static void update_wall_time(void) | |||
| 907 | * getboottime - Return the real time of system boot. | 907 | * getboottime - Return the real time of system boot. |
| 908 | * @ts: pointer to the timespec to be set | 908 | * @ts: pointer to the timespec to be set |
| 909 | * | 909 | * |
| 910 | * Returns the time of day in a timespec. | 910 | * Returns the wall-time of boot in a timespec. |
| 911 | * | 911 | * |
| 912 | * This is based on the wall_to_monotonic offset and the total suspend | 912 | * This is based on the wall_to_monotonic offset and the total suspend |
| 913 | * time. Calls to settimeofday will affect the value returned (which | 913 | * time. Calls to settimeofday will affect the value returned (which |
| @@ -925,6 +925,55 @@ void getboottime(struct timespec *ts) | |||
| 925 | } | 925 | } |
| 926 | EXPORT_SYMBOL_GPL(getboottime); | 926 | EXPORT_SYMBOL_GPL(getboottime); |
| 927 | 927 | ||
| 928 | |||
| 929 | /** | ||
| 930 | * get_monotonic_boottime - Returns monotonic time since boot | ||
| 931 | * @ts: pointer to the timespec to be set | ||
| 932 | * | ||
| 933 | * Returns the monotonic time since boot in a timespec. | ||
| 934 | * | ||
| 935 | * This is similar to CLOCK_MONTONIC/ktime_get_ts, but also | ||
| 936 | * includes the time spent in suspend. | ||
| 937 | */ | ||
| 938 | void get_monotonic_boottime(struct timespec *ts) | ||
| 939 | { | ||
| 940 | struct timespec tomono, sleep; | ||
| 941 | unsigned int seq; | ||
| 942 | s64 nsecs; | ||
| 943 | |||
| 944 | WARN_ON(timekeeping_suspended); | ||
| 945 | |||
| 946 | do { | ||
| 947 | seq = read_seqbegin(&xtime_lock); | ||
| 948 | *ts = xtime; | ||
| 949 | tomono = wall_to_monotonic; | ||
| 950 | sleep = total_sleep_time; | ||
| 951 | nsecs = timekeeping_get_ns(); | ||
| 952 | |||
| 953 | } while (read_seqretry(&xtime_lock, seq)); | ||
| 954 | |||
| 955 | set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec + sleep.tv_sec, | ||
| 956 | ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec + nsecs); | ||
| 957 | } | ||
| 958 | EXPORT_SYMBOL_GPL(get_monotonic_boottime); | ||
| 959 | |||
| 960 | /** | ||
| 961 | * ktime_get_boottime - Returns monotonic time since boot in a ktime | ||
| 962 | * | ||
| 963 | * Returns the monotonic time since boot in a ktime | ||
| 964 | * | ||
| 965 | * This is similar to CLOCK_MONTONIC/ktime_get, but also | ||
| 966 | * includes the time spent in suspend. | ||
| 967 | */ | ||
| 968 | ktime_t ktime_get_boottime(void) | ||
| 969 | { | ||
| 970 | struct timespec ts; | ||
| 971 | |||
| 972 | get_monotonic_boottime(&ts); | ||
| 973 | return timespec_to_ktime(ts); | ||
| 974 | } | ||
| 975 | EXPORT_SYMBOL_GPL(ktime_get_boottime); | ||
| 976 | |||
| 928 | /** | 977 | /** |
| 929 | * monotonic_to_bootbased - Convert the monotonic time to boot based. | 978 | * monotonic_to_bootbased - Convert the monotonic time to boot based. |
| 930 | * @ts: pointer to the timespec to be converted | 979 | * @ts: pointer to the timespec to be converted |
