time: Provide y2038 safe timekeeping_inject_sleeptime() replacement
As part of addressing "y2038 problem" for in-kernel uses, this patch adds timekeeping_inject_sleeptime64() using timespec64. After this patch, timekeeping_inject_sleeptime() is deprecated and all its call sites will be fixed using the new interface, after that it can be removed. NOTE: timekeeping_inject_sleeptime() is safe actually, but we want to eliminate timespec eventually, so comes this patch. Signed-off-by: pang.xunlei <pang.xunlei@linaro.org> Signed-off-by: John Stultz <john.stultz@linaro.org>
This commit is contained in:
@@ -201,7 +201,18 @@ static inline void timekeeping_clocktai(struct timespec *ts)
|
|||||||
/*
|
/*
|
||||||
* RTC specific
|
* RTC specific
|
||||||
*/
|
*/
|
||||||
extern void timekeeping_inject_sleeptime(struct timespec *delta);
|
extern void timekeeping_inject_sleeptime64(struct timespec64 *delta);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deprecated. Use timekeeping_inject_sleeptime64().
|
||||||
|
*/
|
||||||
|
static inline void timekeeping_inject_sleeptime(struct timespec *delta)
|
||||||
|
{
|
||||||
|
struct timespec64 delta64;
|
||||||
|
|
||||||
|
delta64 = timespec_to_timespec64(*delta);
|
||||||
|
timekeeping_inject_sleeptime64(&delta64);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PPS accessor
|
* PPS accessor
|
||||||
|
@@ -1067,8 +1067,8 @@ static void __timekeeping_inject_sleeptime(struct timekeeper *tk,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* timekeeping_inject_sleeptime - Adds suspend interval to timeekeeping values
|
* timekeeping_inject_sleeptime64 - Adds suspend interval to timeekeeping values
|
||||||
* @delta: pointer to a timespec delta value
|
* @delta: pointer to a timespec64 delta value
|
||||||
*
|
*
|
||||||
* This hook is for architectures that cannot support read_persistent_clock
|
* This hook is for architectures that cannot support read_persistent_clock
|
||||||
* because their RTC/persistent clock is only accessible when irqs are enabled.
|
* because their RTC/persistent clock is only accessible when irqs are enabled.
|
||||||
@@ -1076,10 +1076,9 @@ static void __timekeeping_inject_sleeptime(struct timekeeper *tk,
|
|||||||
* This function should only be called by rtc_resume(), and allows
|
* This function should only be called by rtc_resume(), and allows
|
||||||
* a suspend offset to be injected into the timekeeping values.
|
* a suspend offset to be injected into the timekeeping values.
|
||||||
*/
|
*/
|
||||||
void timekeeping_inject_sleeptime(struct timespec *delta)
|
void timekeeping_inject_sleeptime64(struct timespec64 *delta)
|
||||||
{
|
{
|
||||||
struct timekeeper *tk = &tk_core.timekeeper;
|
struct timekeeper *tk = &tk_core.timekeeper;
|
||||||
struct timespec64 tmp;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1094,8 +1093,7 @@ void timekeeping_inject_sleeptime(struct timespec *delta)
|
|||||||
|
|
||||||
timekeeping_forward_now(tk);
|
timekeeping_forward_now(tk);
|
||||||
|
|
||||||
tmp = timespec_to_timespec64(*delta);
|
__timekeeping_inject_sleeptime(tk, delta);
|
||||||
__timekeeping_inject_sleeptime(tk, &tmp);
|
|
||||||
|
|
||||||
timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET);
|
timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user