Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04d90890 authored by pang.xunlei's avatar pang.xunlei Committed by John Stultz
Browse files

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: default avatarpang.xunlei <pang.xunlei@linaro.org>
Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
parent 21f7eca5
Loading
Loading
Loading
Loading
+12 −1
Original line number Original line Diff line number Diff line
@@ -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
+4 −6
Original line number Original line Diff line number Diff line
@@ -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);