lkml.org 
[lkml]   [2009]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC][patch 4/5] clocksource_read/clocksource_read_raw inline functions
    From: Martin Schwidefsky <schwidefsky@de.ibm.com>

    Add clocksource_read / clocksource_read_raw inline functions and use
    them for getnstimeofday, ktime_get, ktime_get_ts and getrawmonotonic.

    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: john stultz <johnstul@us.ibm.com>
    Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
    ---
    include/linux/clocksource.h | 45 +++++++++++++++++++++++++++++++++++++++++++
    kernel/time/timekeeping.c | 46 +++-----------------------------------------
    2 files changed, 49 insertions(+), 42 deletions(-)

    Index: linux-2.6/include/linux/clocksource.h
    ===================================================================
    --- linux-2.6.orig/include/linux/clocksource.h
    +++ linux-2.6/include/linux/clocksource.h
    @@ -284,6 +284,51 @@ static inline s64 cyc2ns(struct clocksou
    return ret;
    }

    +/**
    + * clocksource_read: - Read nanosecond delta from clocksource.
    + * @cs: pointer to clocksource being read
    + *
    + * Read from the clock source and return the clock value converted
    + * to nanoseconds.
    + */
    +static inline s64 clocksource_read(struct clocksource *cs)
    +{
    + cycle_t cycle_now, cycle_delta;
    +
    + /* read clocksource: */
    + cycle_now = cs->read(cs);
    +
    + /* calculate the delta since the last update_wall_time: */
    + cycle_delta = (cycle_now - cs->cycle_last) & cs->mask;
    +
    + /* convert to nanoseconds: */
    + return cyc2ns(cs, cycle_delta);
    +}
    +
    +/**
    + * clocksource_read_raw: - Read raw nanosecond delta from clocksource.
    + * @cs: pointer to clocksource being read
    + *
    + * Read from the clock source and return the clock value converted
    + * to nanoseconds.
    + */
    +static inline s64 clocksource_read_raw(struct clocksource *cs,
    + struct timespec *ts)
    +{
    + cycle_t cycle_now, cycle_delta;
    +
    + *ts = clock->raw_time;
    +
    + /* read clocksource: */
    + cycle_now = cs->read(cs);
    +
    + /* calculate the delta since the last update_wall_time: */
    + cycle_delta = (cycle_now - cs->cycle_last) & cs->mask;
    +
    + /* convert to nanoseconds: */
    + return ((s64) cycle_delta * clock->mult_orig) >> clock->shift;
    +}
    +
    /* used to install a new clocksource */
    extern void __init clocksource_init(void);
    extern int clocksource_register(struct clocksource*);
    Index: linux-2.6/kernel/time/timekeeping.c
    ===================================================================
    --- linux-2.6.orig/kernel/time/timekeeping.c
    +++ linux-2.6/kernel/time/timekeeping.c
    @@ -66,7 +66,6 @@ void update_xtime_cache(u64 nsec)
    */
    void getnstimeofday(struct timespec *ts)
    {
    - cycle_t cycle_now, cycle_delta;
    unsigned long seq;
    s64 nsecs;

    @@ -76,15 +75,7 @@ void getnstimeofday(struct timespec *ts)
    seq = read_seqbegin(&xtime_lock);

    *ts = xtime;
    -
    - /* read clocksource: */
    - cycle_now = clock->read(clock);
    -
    - /* calculate the delta since the last update_wall_time: */
    - cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
    -
    - /* convert to nanoseconds: */
    - nsecs = cyc2ns(clock, cycle_delta);
    + nsecs = clocksource_read(clock);

    /* If arch requires, add in gettimeoffset() */
    nsecs += arch_gettimeoffset();
    @@ -98,7 +89,6 @@ EXPORT_SYMBOL(getnstimeofday);

    ktime_t ktime_get(void)
    {
    - cycle_t cycle_now, cycle_delta;
    unsigned int seq;
    s64 secs, nsecs;

    @@ -108,15 +98,7 @@ ktime_t ktime_get(void)
    seq = read_seqbegin(&xtime_lock);
    secs = xtime.tv_sec + wall_to_monotonic.tv_sec;
    nsecs = xtime.tv_nsec + wall_to_monotonic.tv_nsec;
    -
    - /* read clocksource: */
    - cycle_now = clock->read(clock);
    -
    - /* calculate the delta since the last update_wall_time: */
    - cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
    -
    - /* convert to nanoseconds: */
    - nsecs += cyc2ns(clock, cycle_delta);
    + nsecs += clocksource_read(clock);

    } while (read_seqretry(&xtime_lock, seq));
    /*
    @@ -137,7 +119,6 @@ EXPORT_SYMBOL_GPL(ktime_get);
    */
    void ktime_get_ts(struct timespec *ts)
    {
    - cycle_t cycle_now, cycle_delta;
    struct timespec tomono;
    unsigned int seq;
    s64 nsecs;
    @@ -148,15 +129,7 @@ void ktime_get_ts(struct timespec *ts)
    seq = read_seqbegin(&xtime_lock);
    *ts = xtime;
    tomono = wall_to_monotonic;
    -
    - /* read clocksource: */
    - cycle_now = clock->read(clock);
    -
    - /* calculate the delta since the last update_wall_time: */
    - cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
    -
    - /* convert to nanoseconds: */
    - nsecs = cyc2ns(clock, cycle_delta);
    + nsecs = clocksource_read(clock);

    } while (read_seqretry(&xtime_lock, seq));

    @@ -290,21 +263,10 @@ void getrawmonotonic(struct timespec *ts
    {
    unsigned long seq;
    s64 nsecs;
    - cycle_t cycle_now, cycle_delta;

    do {
    seq = read_seqbegin(&xtime_lock);
    -
    - /* read clocksource: */
    - cycle_now = clock->read(clock);
    -
    - /* calculate the delta since the last update_wall_time: */
    - cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
    -
    - /* convert to nanoseconds: */
    - nsecs = ((s64)cycle_delta * clock->mult_orig) >> clock->shift;
    -
    - *ts = clock->raw_time;
    + nsecs = clocksource_read_raw(clock, ts);

    } while (read_seqretry(&xtime_lock, seq));

    --
    blue skies,
    Martin.

    "Reality continues to ruin my life." - Calvin.



    \
     
     \ /
      Last update: 2009-07-21 21:25    [W:0.030 / U:31.588 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site