diff options
-rw-r--r-- | arch/s390/kernel/time.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 9a1d95894f3d..c36353e8c140 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -237,6 +237,8 @@ int sysctl_hz_timer = 1; | |||
237 | */ | 237 | */ |
238 | static inline void stop_hz_timer(void) | 238 | static inline void stop_hz_timer(void) |
239 | { | 239 | { |
240 | unsigned long flags; | ||
241 | unsigned long seq, next; | ||
240 | __u64 timer, todval; | 242 | __u64 timer, todval; |
241 | 243 | ||
242 | if (sysctl_hz_timer != 0) | 244 | if (sysctl_hz_timer != 0) |
@@ -257,7 +259,11 @@ static inline void stop_hz_timer(void) | |||
257 | * This cpu is going really idle. Set up the clock comparator | 259 | * This cpu is going really idle. Set up the clock comparator |
258 | * for the next event. | 260 | * for the next event. |
259 | */ | 261 | */ |
260 | timer = (__u64) (next_timer_interrupt() - jiffies) + jiffies_64; | 262 | next = next_timer_interrupt(); |
263 | do { | ||
264 | seq = read_seqbegin_irqsave(&xtime_lock, flags); | ||
265 | timer = (__u64)(next - jiffies) + jiffies_64; | ||
266 | } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); | ||
261 | todval = -1ULL; | 267 | todval = -1ULL; |
262 | /* Be careful about overflows. */ | 268 | /* Be careful about overflows. */ |
263 | if (timer < (-1ULL / CLK_TICKS_PER_JIFFY)) { | 269 | if (timer < (-1ULL / CLK_TICKS_PER_JIFFY)) { |