lkml.org 
[lkml]   [2010]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:timers/clocksource] time: Implement timespec_add
    Commit-ID:  ce3bf7ab22527183634a76512d9854a38615e4d5
    Gitweb: http://git.kernel.org/tip/ce3bf7ab22527183634a76512d9854a38615e4d5
    Author: John Stultz <johnstul@us.ibm.com>
    AuthorDate: Tue, 13 Jul 2010 17:56:19 -0700
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Tue, 27 Jul 2010 12:40:53 +0200

    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>

    ---
    include/linux/time.h | 16 ++++++++++++++++
    kernel/time/timekeeping.c | 6 +++---
    2 files changed, 19 insertions(+), 3 deletions(-)

    diff --git a/include/linux/time.h b/include/linux/time.h
    index ea3559f0..9072df8 100644
    --- a/include/linux/time.h
    +++ b/include/linux/time.h
    @@ -76,9 +76,25 @@ extern unsigned long mktime(const unsigned int year, const unsigned int mon,
    const unsigned int min, const unsigned int sec);

    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,
    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
    */
    diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
    index caf8d4d..623fe3d 100644
    --- a/kernel/time/timekeeping.c
    +++ b/kernel/time/timekeeping.c
    @@ -579,9 +579,9 @@ static int timekeeping_resume(struct sys_device *dev)

    if (timespec_compare(&ts, &timekeeping_suspend_time) > 0) {
    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);
    - 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 */
    timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock);
    @@ -887,7 +887,7 @@ EXPORT_SYMBOL_GPL(getboottime);
    */
    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);


    \
     
     \ /
      Last update: 2010-07-27 12:49    [W:0.025 / U:60.128 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site