Commit 9a806ddb authored by Xunlei Pang's avatar Xunlei Pang Committed by Ingo Molnar

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: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarXunlei Pang <pang.xunlei@linaro.org>
Signed-off-by: default avatarJohn 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.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 3650b57f
...@@ -269,6 +269,7 @@ static inline bool has_persistent_clock(void) ...@@ -269,6 +269,7 @@ static inline bool has_persistent_clock(void)
extern void read_persistent_clock(struct timespec *ts); extern void read_persistent_clock(struct timespec *ts);
extern void read_boot_clock(struct timespec *ts); extern void read_boot_clock(struct timespec *ts);
extern void read_boot_clock64(struct timespec64 *ts);
extern int update_persistent_clock(struct timespec now); extern int update_persistent_clock(struct timespec now);
......
...@@ -1188,6 +1188,14 @@ void __weak read_boot_clock(struct timespec *ts) ...@@ -1188,6 +1188,14 @@ void __weak read_boot_clock(struct timespec *ts)
ts->tv_nsec = 0; ts->tv_nsec = 0;
} }
void __weak read_boot_clock64(struct timespec64 *ts64)
{
struct timespec ts;
read_boot_clock(&ts);
*ts64 = timespec_to_timespec64(ts);
}
/* /*
* timekeeping_init - Initializes the clocksource and common timekeeping values * timekeeping_init - Initializes the clocksource and common timekeeping values
*/ */
...@@ -1209,8 +1217,7 @@ void __init timekeeping_init(void) ...@@ -1209,8 +1217,7 @@ void __init timekeeping_init(void)
} else if (now.tv_sec || now.tv_nsec) } else if (now.tv_sec || now.tv_nsec)
persistent_clock_exist = true; persistent_clock_exist = true;
read_boot_clock(&ts); read_boot_clock64(&boot);
boot = timespec_to_timespec64(ts);
if (!timespec64_valid_strict(&boot)) { if (!timespec64_valid_strict(&boot)) {
pr_warn("WARNING: Boot clock returned invalid value!\n" pr_warn("WARNING: Boot clock returned invalid value!\n"
" Check your CMOS/BIOS settings.\n"); " Check your CMOS/BIOS settings.\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment