@@ -925,6 +925,22 @@ void tick_nohz_idle_exit(void)
ts->inidle = 0;
+ /*
+ * Can idle_active be false here?
+ * Ideally this would be the sequence of calls:
+ * - tick_nohz_idle_enter(), i.e. idle_active = true;
+ * - local_irq_disable()
+ * - IDLE
+ * - wake up due to IPI or other interrupt
+ * - local_irq_enable()
+ * - tick_nohz_irq_enter(), i.e. idle_active = false;
+ * - tick_nohz_irq_exit(), i.e. idle_active = true; This is not called
+ * in case of IPI's as need_resched() will prevent that in
+ * tick_irq_exit(), as we don't need to account any more for idle time
+ * or try to enter dyntics mode (We are going to exit idle state).
+ *
+ * - tick_nohz_idle_exit()
+ */
if (ts->idle_active || ts->tick_stopped)
now = ktime_get();
The sequence of calls for dynticks CPUs was a bit confusing and so adding a comment in tick_nohz_idle_exit() routine to mention it clearly. All information required is in commit and this conversation with Frederic. https://lkml.org/lkml/2014/4/10/355 Suggested-by: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- kernel/time/tick-sched.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)