Reinstate blk schedule plug check and flush after grq locking. -ck --- kernel/sched/bfs.c | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) Index: linux-3.18-ck1/kernel/sched/bfs.c =================================================================== --- linux-3.18-ck1.orig/kernel/sched/bfs.c 2014-12-11 12:20:16.435016942 +1100 +++ linux-3.18-ck1/kernel/sched/bfs.c 2014-12-31 09:53:47.520884778 +1100 @@ -3348,7 +3348,7 @@ static void wake_smt_siblings(int __mayb * - return from syscall or exception to user-space * - return from interrupt-handler to user-space */ -static void __sched __schedule(void) +asmlinkage __visible void __sched schedule(void) { struct task_struct *prev, *next, *idle; unsigned long *switch_count; @@ -3404,6 +3404,17 @@ need_resched: switch_count = &prev->nvcsw; } + /* + * If we are going to sleep and we have plugged IO queued, make + * sure to submit it to avoid deadlocks. + */ + if (unlikely(deactivate && blk_needs_flush_plug(prev))) { + grq_unlock_irq(); + preempt_enable_no_resched(); + blk_schedule_flush_plug(prev); + goto need_resched; + } + update_clocks(rq); update_cpu_clock_switch(rq, prev); if (rq->clock - rq->last_tick > HALF_JIFFY_NS) @@ -3503,25 +3514,6 @@ rerun_prev_unlocked: goto need_resched; } -static inline void sched_submit_work(struct task_struct *tsk) -{ - if (!tsk->state || tsk_is_pi_blocked(tsk)) - return; - /* - * If we are going to sleep and we have plugged IO queued, - * make sure to submit it to avoid deadlocks. - */ - if (blk_needs_flush_plug(tsk)) - blk_schedule_flush_plug(tsk); -} - -asmlinkage __visible void __sched schedule(void) -{ - struct task_struct *tsk = current; - - sched_submit_work(tsk); - __schedule(); -} EXPORT_SYMBOL(schedule); #ifdef CONFIG_CONTEXT_TRACKING