From: Martin Schwidefsky Add clocksource_read / clocksource_read_raw inline functions and use them for getnstimeofday, ktime_get, ktime_get_ts and getrawmonotonic. Cc: Ingo Molnar Cc: Thomas Gleixner Cc: john stultz Signed-off-by: Martin Schwidefsky --- 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. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/