aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorXunlei Pang <pang.xunlei@linaro.org>2015-04-01 23:34:21 -0400
committerIngo Molnar <mingo@kernel.org>2015-04-03 02:18:18 -0400
commit9a806ddbb9a18c510e4acdcc828b9a87f5fd3aef (patch)
tree7c16d137151063eab10962c46b0781a81b82e21f /kernel
parent3650b57fdf208bc0e36cbe7b5e0744bd0e0cf34d (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.c11
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
1191void __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");