sched/core: Avoid __schedule() being called twice in a row
[ Upstream commit 2bb94c48b2ffaabf8c15a51e5cc1b4c541988cab ]
If a worker invokes schedule() then we may have the call chain:
schedule()
-> sched_submit_work()
-> wq_worker_sleeping()
-> wake_up_worker()
-> wake_up_process().
The last wakeup may cause a schedule which is unnecessary because we are
already in schedule() and do it anyway.
Add a preempt_disable() + preempt_enable_no_resched() around
wq_worker_sleeping() so the context switch could be delayed until
__schedule().
Signed-off-by:
Daniel Bristot de Oliveira <bristot@redhat.com>
Cc: Clark Williams <williams@redhat.com>
Cc: Tommaso Cucinotta <tommaso.cucinotta@sssup.it>
Cc: Romulo da Silva de Oliveira <romulo.deoliveira@ufsc.br>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by:
Steven Rostedt (VMware) <rostedt@goodmis.org>
[bigeasy: rewrite changelog]
Signed-off-by:
Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Loading
Please sign in to comment