Files
erofs-linux/kernel
Frederic Weisbecker bfd9b2b5f8 sched: Pull resched loop to __schedule() callers
__schedule() disables preemption during its job and re-enables it
afterward without doing a preemption check to avoid recursion.

But if an event happens after the context switch which requires
rescheduling, we need to check again if a task of a higher priority
needs the CPU. A preempt irq can raise such a situation. To handle that,
__schedule() loops on need_resched().

But preempt_schedule_*() functions, which call __schedule(), also loop
on need_resched() to handle missed preempt irqs. Hence we end up with
the same loop happening twice.

Lets simplify that by attributing the need_resched() loop responsibility
to all __schedule() callers.

There is a risk that the outer loop now handles reschedules that used
to be handled by the inner loop with the added overhead of caller details
(inc/dec of PREEMPT_ACTIVE, irq save/restore) but assuming those inner
rescheduling loop weren't too frequent, this shouldn't matter. Especially
since the whole preemption path is now losing one loop in any case.

Suggested-by: Linus Torvalds <[email protected]>
Signed-off-by: Frederic Weisbecker <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Cc: Steven Rostedt <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
2015-02-04 07:52:30 +01:00
..
2014-12-19 22:55:06 +01:00
2014-10-09 22:26:04 -04:00
2014-10-09 22:26:04 -04:00
…
…
…
…
…
2014-11-03 19:21:01 -08:00
…
…
…
…
…
2014-12-04 14:34:54 -05:00
…
2014-12-10 17:41:10 -08:00
…
2015-01-17 10:02:23 +13:00
…
…
…
2014-12-10 17:41:10 -08:00
2014-11-19 13:01:25 -05:00
…
…
…