|
@@ -2765,6 +2765,10 @@ again:
|
|
|
* - explicit schedule() call
|
|
|
* - return from syscall or exception to user-space
|
|
|
* - return from interrupt-handler to user-space
|
|
|
+ *
|
|
|
+ * WARNING: all callers must re-check need_resched() afterward and reschedule
|
|
|
+ * accordingly in case an event triggered the need for rescheduling (such as
|
|
|
+ * an interrupt waking up a task) while preemption was disabled in __schedule().
|
|
|
*/
|
|
|
static void __sched __schedule(void)
|
|
|
{
|
|
@@ -2773,7 +2777,6 @@ static void __sched __schedule(void)
|
|
|
struct rq *rq;
|
|
|
int cpu;
|
|
|
|
|
|
-need_resched:
|
|
|
preempt_disable();
|
|
|
cpu = smp_processor_id();
|
|
|
rq = cpu_rq(cpu);
|
|
@@ -2840,8 +2843,6 @@ need_resched:
|
|
|
post_schedule(rq);
|
|
|
|
|
|
sched_preempt_enable_no_resched();
|
|
|
- if (need_resched())
|
|
|
- goto need_resched;
|
|
|
}
|
|
|
|
|
|
static inline void sched_submit_work(struct task_struct *tsk)
|
|
@@ -2861,7 +2862,9 @@ asmlinkage __visible void __sched schedule(void)
|
|
|
struct task_struct *tsk = current;
|
|
|
|
|
|
sched_submit_work(tsk);
|
|
|
- __schedule();
|
|
|
+ do {
|
|
|
+ __schedule();
|
|
|
+ } while (need_resched());
|
|
|
}
|
|
|
EXPORT_SYMBOL(schedule);
|
|
|
|