time: Implement timespec_add
After accidentally misusing timespec_add_safe, I wanted to make sure we don't accidently trip over that issue again, so I created a simple timespec_add() function which we can use to replace the instances of timespec_add_safe() that don't want the overflow detection. Signed-off-by: John Stultz <johnstul@us.ibm.com> LKML-Reference: <1279068988-21864-3-git-send-email-johnstul@us.ibm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
committed by
Thomas Gleixner
parent
8c73626ab2
commit
ce3bf7ab22
@@ -76,9 +76,25 @@ extern unsigned long mktime(const unsigned int year, const unsigned int mon,
|
|||||||
const unsigned int min, const unsigned int sec);
|
const unsigned int min, const unsigned int sec);
|
||||||
|
|
||||||
extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec);
|
extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* timespec_add_safe assumes both values are positive and checks
|
||||||
|
* for overflow. It will return TIME_T_MAX if the reutrn would be
|
||||||
|
* smaller then either of the arguments.
|
||||||
|
*/
|
||||||
extern struct timespec timespec_add_safe(const struct timespec lhs,
|
extern struct timespec timespec_add_safe(const struct timespec lhs,
|
||||||
const struct timespec rhs);
|
const struct timespec rhs);
|
||||||
|
|
||||||
|
|
||||||
|
static inline struct timespec timespec_add(struct timespec lhs,
|
||||||
|
struct timespec rhs)
|
||||||
|
{
|
||||||
|
struct timespec ts_delta;
|
||||||
|
set_normalized_timespec(&ts_delta, lhs.tv_sec + rhs.tv_sec,
|
||||||
|
lhs.tv_nsec + rhs.tv_nsec);
|
||||||
|
return ts_delta;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sub = lhs - rhs, in normalized form
|
* sub = lhs - rhs, in normalized form
|
||||||
*/
|
*/
|
||||||
|
@@ -579,9 +579,9 @@ static int timekeeping_resume(struct sys_device *dev)
|
|||||||
|
|
||||||
if (timespec_compare(&ts, &timekeeping_suspend_time) > 0) {
|
if (timespec_compare(&ts, &timekeeping_suspend_time) > 0) {
|
||||||
ts = timespec_sub(ts, timekeeping_suspend_time);
|
ts = timespec_sub(ts, timekeeping_suspend_time);
|
||||||
xtime = timespec_add_safe(xtime, ts);
|
xtime = timespec_add(xtime, ts);
|
||||||
wall_to_monotonic = timespec_sub(wall_to_monotonic, ts);
|
wall_to_monotonic = timespec_sub(wall_to_monotonic, ts);
|
||||||
total_sleep_time = timespec_add_safe(total_sleep_time, ts);
|
total_sleep_time = timespec_add(total_sleep_time, ts);
|
||||||
}
|
}
|
||||||
/* re-base the last cycle value */
|
/* re-base the last cycle value */
|
||||||
timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock);
|
timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock);
|
||||||
@@ -887,7 +887,7 @@ EXPORT_SYMBOL_GPL(getboottime);
|
|||||||
*/
|
*/
|
||||||
void monotonic_to_bootbased(struct timespec *ts)
|
void monotonic_to_bootbased(struct timespec *ts)
|
||||||
{
|
{
|
||||||
*ts = timespec_add_safe(*ts, total_sleep_time);
|
*ts = timespec_add(*ts, total_sleep_time);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(monotonic_to_bootbased);
|
EXPORT_SYMBOL_GPL(monotonic_to_bootbased);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user