OSDN Git Service

sched: idle: Avoid retaining the tick when it has been stopped
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 9 Aug 2018 17:08:34 +0000 (19:08 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 20 Aug 2018 09:25:55 +0000 (11:25 +0200)
If the tick has been stopped already, but the governor has not asked to
stop it (which it can do sometimes), the idle loop should invoke
tick_nohz_idle_stop_tick(), to let tick_nohz_stop_tick() take care
of this case properly.

Fixes: 554c8aa8ecad (sched: idle: Select idle state before stopping the tick)
Cc: 4.17+ <stable@vger.kernel.org> # 4.17+
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
kernel/sched/idle.c

index 1a3e9bd..16f8414 100644 (file)
@@ -190,7 +190,7 @@ static void cpuidle_idle_call(void)
                 */
                next_state = cpuidle_select(drv, dev, &stop_tick);
 
-               if (stop_tick)
+               if (stop_tick || tick_nohz_tick_stopped())
                        tick_nohz_idle_stop_tick();
                else
                        tick_nohz_idle_retain_tick();