On Fri, Dec 22, 2017 at 03:51:13PM +0100, Thomas Gleixner wrote:
The conditions in irq_exit() to invoke tick_nohz_irq_exit() are:
if ((idle_cpu(cpu) && !need_resched()) || tick_nohz_full_cpu(cpu))
This is too permissive in various aspects:
- If need_resched() is set, then the tick cannot be stopped whether the CPU is idle or in nohz full mode.
That's not exactly true. In nohz full mode the tick is not restarted on the switch from idle to a single task. And if an idle interrupt wakes up a single task and enqueues a timer, we want that timer to be programmed even though we have need_resched().