Revert "nohz: Fix collision between tick and other hrtimers"
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 16 Feb 2017 20:19:18 +0000 (12:19 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 16 Feb 2017 20:19:18 +0000 (12:19 -0800)
This reverts commit 24b91e360ef521a2808771633d76ebc68bd5604b and commit
7bdb59f1ad47 ("tick/nohz: Fix possible missing clock reprog after tick
soft restart") that depends on it,

Pavel reports that it causes occasional boot hangs for him that seem to
depend on just how the machine was booted.  In particular, his machine
hangs at around the PCI fixups of the EHCI USB host controller, but only
hangs from cold boot, not from a warm boot.

Thomas Gleixner suspecs it's a CPU hotplug interaction, particularly
since Pavel also saw suspend/resume issues that seem to be related.
We're reverting for now while trying to figure out the root cause.

Reported-bisected-and-tested-by: Pavel Machek <pavel@ucw.cz>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Wanpeng Li <wanpeng.li@hotmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@kernel.org # reverted commits were marked for stable
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
kernel/time/tick-sched.c
kernel/time/tick-sched.h

index fc6f740d02771284d18791633c6740861574a105..2c115fdab39765f4ecbeaade9fa74008e711d08a 100644 (file)
@@ -725,11 +725,6 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts,
                 */
                if (delta == 0) {
                        tick_nohz_restart(ts, now);
-                       /*
-                        * Make sure next tick stop doesn't get fooled by past
-                        * clock deadline
-                        */
-                       ts->next_tick = 0;
                        goto out;
                }
        }
@@ -772,7 +767,7 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts,
        tick = expires;
 
        /* Skip reprogram of event if its not changed */
-       if (ts->tick_stopped && (expires == ts->next_tick))
+       if (ts->tick_stopped && (expires == dev->next_event))
                goto out;
 
        /*
@@ -792,8 +787,6 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts,
                trace_tick_stop(1, TICK_DEP_MASK_NONE);
        }
 
-       ts->next_tick = tick;
-
        /*
         * If the expiration time == KTIME_MAX, then we simply stop
         * the tick timer.
@@ -809,10 +802,7 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts,
        else
                tick_program_event(tick, 1);
 out:
-       /*
-        * Update the estimated sleep length until the next timer
-        * (not only the tick).
-        */
+       /* Update the estimated sleep length */
        ts->sleep_length = ktime_sub(dev->next_event, now);
        return tick;
 }
index 075444e3d48e643549ba5c7fbcc3c792fb90e1db..bf38226e5c17c15e276c2e4e8c5f4fe423e071f3 100644 (file)
@@ -27,7 +27,6 @@ enum tick_nohz_mode {
  *                     timer is modified for nohz sleeps. This is necessary
  *                     to resume the tick timer operation in the timeline
  *                     when the CPU returns from nohz sleep.
- * @next_tick:         Next tick to be fired when in dynticks mode.
  * @tick_stopped:      Indicator that the idle tick has been stopped
  * @idle_jiffies:      jiffies at the entry to idle for idle time accounting
  * @idle_calls:                Total number of idle calls
@@ -45,7 +44,6 @@ struct tick_sched {
        unsigned long                   check_clocks;
        enum tick_nohz_mode             nohz_mode;
        ktime_t                         last_tick;
-       ktime_t                         next_tick;
        int                             inidle;
        int                             tick_stopped;
        unsigned long                   idle_jiffies;