Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc-merge
[firefly-linux-kernel-4.4.55.git] / arch / s390 / kernel / time.c
index 9a1d95894f3df95e8201f210894ab88dcf651e07..7c0fe152a111f394b6310a6fbd535615388372fd 100644 (file)
@@ -214,7 +214,7 @@ void account_ticks(struct pt_regs *regs)
 #endif
 
 #ifdef CONFIG_VIRT_CPU_ACCOUNTING
-       account_user_vtime(current);
+       account_tick_vtime(current);
 #else
        while (ticks--)
                update_process_times(user_mode(regs));
@@ -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)) {
@@ -276,7 +282,7 @@ static inline void start_hz_timer(void)
 {
        if (!cpu_isset(smp_processor_id(), nohz_cpu_mask))
                return;
-       account_ticks(__KSTK_PTREGS(current));
+       account_ticks(task_pt_regs(current));
        cpu_clear(smp_processor_id(), nohz_cpu_mask);
 }