|
@@ -237,6 +237,8 @@ int sysctl_hz_timer = 1;
|
|
|
*/
|
|
|
static inline void stop_hz_timer(void)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
+ unsigned long seq, next;
|
|
|
__u64 timer, todval;
|
|
|
|
|
|
if (sysctl_hz_timer != 0)
|
|
@@ -257,7 +259,11 @@ static inline void stop_hz_timer(void)
|
|
|
* This cpu is going really idle. Set up the clock comparator
|
|
|
* for the next event.
|
|
|
*/
|
|
|
- timer = (__u64) (next_timer_interrupt() - jiffies) + jiffies_64;
|
|
|
+ next = next_timer_interrupt();
|
|
|
+ do {
|
|
|
+ seq = read_seqbegin_irqsave(&xtime_lock, flags);
|
|
|
+ timer = (__u64)(next - jiffies) + jiffies_64;
|
|
|
+ } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
|
|
|
todval = -1ULL;
|
|
|
/* Be careful about overflows. */
|
|
|
if (timer < (-1ULL / CLK_TICKS_PER_JIFFY)) {
|