diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 480adeb63f8f..ae659b99ce73 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -4115,6 +4115,16 @@ need_resched: | |||
4115 | switch_count = &prev->nvcsw; | 4115 | switch_count = &prev->nvcsw; |
4116 | } | 4116 | } |
4117 | 4117 | ||
4118 | /* | ||
4119 | * If we are going to sleep and we have plugged IO queued, make | ||
4120 | * sure to submit it to avoid deadlocks. | ||
4121 | */ | ||
4122 | if (prev->state != TASK_RUNNING && blk_needs_flush_plug(prev)) { | ||
4123 | raw_spin_unlock(&rq->lock); | ||
4124 | blk_flush_plug(prev); | ||
4125 | raw_spin_lock(&rq->lock); | ||
4126 | } | ||
4127 | |||
4118 | pre_schedule(rq, prev); | 4128 | pre_schedule(rq, prev); |
4119 | 4129 | ||
4120 | if (unlikely(!rq->nr_running)) | 4130 | if (unlikely(!rq->nr_running)) |
@@ -5528,6 +5538,7 @@ void __sched io_schedule(void) | |||
5528 | 5538 | ||
5529 | delayacct_blkio_start(); | 5539 | delayacct_blkio_start(); |
5530 | atomic_inc(&rq->nr_iowait); | 5540 | atomic_inc(&rq->nr_iowait); |
5541 | blk_flush_plug(current); | ||
5531 | current->in_iowait = 1; | 5542 | current->in_iowait = 1; |
5532 | schedule(); | 5543 | schedule(); |
5533 | current->in_iowait = 0; | 5544 | current->in_iowait = 0; |
@@ -5543,6 +5554,7 @@ long __sched io_schedule_timeout(long timeout) | |||
5543 | 5554 | ||
5544 | delayacct_blkio_start(); | 5555 | delayacct_blkio_start(); |
5545 | atomic_inc(&rq->nr_iowait); | 5556 | atomic_inc(&rq->nr_iowait); |
5557 | blk_flush_plug(current); | ||
5546 | current->in_iowait = 1; | 5558 | current->in_iowait = 1; |
5547 | ret = schedule_timeout(timeout); | 5559 | ret = schedule_timeout(timeout); |
5548 | current->in_iowait = 0; | 5560 | current->in_iowait = 0; |