On Mon, Apr 21, 2014 at 03:25:10PM +0530, Viresh Kumar wrote:
The sequence of calls for dynticks CPUs is a bit confusing. Add a comment in tick_nohz_idle_exit() 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(+)
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 71f64ee..c3aed50 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -922,6 +922,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();*/
It's still over-detailed. Much of the above is easily deduced after common review. OTOH I proposed to summarize there: https://lkml.org/lkml/2014/4/11/334 The below disambiguates it a bit further.
Now it's eventually getting as big as your comment ;-)
/* * ts->idle_active drives the idle time which typically elapses in the idle loop * but breaks on IRQs interrupting idle loop. * * Hence ts->idle_active can be 1 here if we exit the idle loop without the help of * an IRQ. OTOH it can be 0 on idle exit if a wake up IPI pulled the CPU out of * the idle loop. Since we know that we'll be exiting the idle task after the wake * up IPI, all the pending idle sleep time is flushed on irq entry and no more is * accounted further thanks to the need_resched() check on irq_exit(). */
Thanks.