diff options
author | Xunlei Pang <pang.xunlei@linaro.org> | 2015-04-01 23:34:21 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-04-03 02:18:18 -0400 |
commit | 9a806ddbb9a18c510e4acdcc828b9a87f5fd3aef (patch) | |
tree | 7c16d137151063eab10962c46b0781a81b82e21f /kernel | |
parent | 3650b57fdf208bc0e36cbe7b5e0744bd0e0cf34d (diff) |
time: Add y2038 safe read_boot_clock64()
As part of addressing in-kernel y2038 issues, this patch adds
read_boot_clock64() and replaces all the call sites of
read_boot_clock() with this function. This is a __weak
implementation, which simply calls the existing y2038 unsafe
read_boot_clock().
This allows architecture specific implementations to be
converted independently, and eventually the y2038 unsafe
read_boot_clock() can be removed after all its architecture
specific implementations have been converted to
read_boot_clock64().
Suggested-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Xunlei Pang <pang.xunlei@linaro.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1427945681-29972-2-git-send-email-john.stultz@linaro.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/time/timekeeping.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 5b12292b343a..652e50a9c6ed 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -1188,6 +1188,14 @@ void __weak read_boot_clock(struct timespec *ts) | |||
1188 | ts->tv_nsec = 0; | 1188 | ts->tv_nsec = 0; |
1189 | } | 1189 | } |
1190 | 1190 | ||
1191 | void __weak read_boot_clock64(struct timespec64 *ts64) | ||
1192 | { | ||
1193 | struct timespec ts; | ||
1194 | |||
1195 | read_boot_clock(&ts); | ||
1196 | *ts64 = timespec_to_timespec64(ts); | ||
1197 | } | ||
1198 | |||
1191 | /* | 1199 | /* |
1192 | * timekeeping_init - Initializes the clocksource and common timekeeping values | 1200 | * timekeeping_init - Initializes the clocksource and common timekeeping values |
1193 | */ | 1201 | */ |
@@ -1209,8 +1217,7 @@ void __init timekeeping_init(void) | |||
1209 | } else if (now.tv_sec || now.tv_nsec) | 1217 | } else if (now.tv_sec || now.tv_nsec) |
1210 | persistent_clock_exist = true; | 1218 | persistent_clock_exist = true; |
1211 | 1219 | ||
1212 | read_boot_clock(&ts); | 1220 | read_boot_clock64(&boot); |
1213 | boot = timespec_to_timespec64(ts); | ||
1214 | if (!timespec64_valid_strict(&boot)) { | 1221 | if (!timespec64_valid_strict(&boot)) { |
1215 | pr_warn("WARNING: Boot clock returned invalid value!\n" | 1222 | pr_warn("WARNING: Boot clock returned invalid value!\n" |
1216 | " Check your CMOS/BIOS settings.\n"); | 1223 | " Check your CMOS/BIOS settings.\n"); |