From 1d9c16fee970da1052a11d839ff1bf0781080a7a Mon Sep 17 00:00:00 2001 From: John Stultz Date: Tue, 13 Jul 2010 17:56:25 -0700 Subject: [PATCH] --- yaml --- r: 206149 b: refs/heads/master c: 8ab4351a4c888016620f43bde605b3d0964af339 h: refs/heads/master i: 206147: 1602e52072e3bbe3baba3f52515737f875df938e v: v3 --- [refs] | 2 +- trunk/include/linux/time.h | 3 ++- trunk/kernel/hrtimer.c | 9 ++++----- trunk/kernel/time/timekeeping.c | 5 +++++ 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 458ebac5dd3e..c6677c422629 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9f31f5774961a735687fee17953ab505b3df3abf +refs/heads/master: 8ab4351a4c888016620f43bde605b3d0964af339 diff --git a/trunk/include/linux/time.h b/trunk/include/linux/time.h index 9072df83de1f..a57e0f67b3d0 100644 --- a/trunk/include/linux/time.h +++ b/trunk/include/linux/time.h @@ -126,7 +126,8 @@ extern int timekeeping_suspended; unsigned long get_seconds(void); struct timespec current_kernel_time(void); -struct timespec __current_kernel_time(void); /* does not hold xtime_lock */ +struct timespec __current_kernel_time(void); /* does not take xtime_lock */ +struct timespec __get_wall_to_monotonic(void); /* does not take xtime_lock */ struct timespec get_monotonic_coarse(void); #define CURRENT_TIME (current_kernel_time()) diff --git a/trunk/kernel/hrtimer.c b/trunk/kernel/hrtimer.c index 5c69e996bd0f..809f48c70553 100644 --- a/trunk/kernel/hrtimer.c +++ b/trunk/kernel/hrtimer.c @@ -90,7 +90,7 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) do { seq = read_seqbegin(&xtime_lock); xts = __current_kernel_time(); - tom = wall_to_monotonic; + tom = __get_wall_to_monotonic(); } while (read_seqretry(&xtime_lock, seq)); xtim = timespec_to_ktime(xts); @@ -612,7 +612,7 @@ static int hrtimer_reprogram(struct hrtimer *timer, static void retrigger_next_event(void *arg) { struct hrtimer_cpu_base *base; - struct timespec realtime_offset; + struct timespec realtime_offset, wtm; unsigned long seq; if (!hrtimer_hres_active()) @@ -620,10 +620,9 @@ static void retrigger_next_event(void *arg) do { seq = read_seqbegin(&xtime_lock); - set_normalized_timespec(&realtime_offset, - -wall_to_monotonic.tv_sec, - -wall_to_monotonic.tv_nsec); + wtm = __get_wall_to_monotonic(); } while (read_seqretry(&xtime_lock, seq)); + set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec); base = &__get_cpu_var(hrtimer_bases); diff --git a/trunk/kernel/time/timekeeping.c b/trunk/kernel/time/timekeeping.c index b15c3acafd5a..fb61c2ed3660 100644 --- a/trunk/kernel/time/timekeeping.c +++ b/trunk/kernel/time/timekeeping.c @@ -858,6 +858,11 @@ struct timespec __current_kernel_time(void) return xtime; } +struct timespec __get_wall_to_monotonic(void) +{ + return wall_to_monotonic; +} + struct timespec current_kernel_time(void) { struct timespec now;