diff options
| author | Jens Axboe <axboe@fb.com> | 2017-03-14 11:51:59 -0600 | 
|---|---|---|
| committer | Jens Axboe <axboe@fb.com> | 2017-03-14 11:51:59 -0600 | 
| commit | 9c62110454b088b4914ffe375c2dbc19643eac34 (patch) | |
| tree | 37f65ae1ac5073f4bf3d31b94b1bc5fc7c706072 /block | |
| parent | 4a3a485b1ed0e109718cc8c9d094fa0f552de9b2 (diff) | |
| download | linux-9c62110454b088b4914ffe375c2dbc19643eac34.tar.bz2 | |
blk-mq-sched: don't run the queue async from blk_mq_try_issue_directly()
If we have scheduling enabled, we jump directly to insert-and-run.
That's fine, but we run the queue async and we don't pass in information
on whether we can block from this context or not. Fixup both these
cases.
Reviewed-by: Bart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
| -rw-r--r-- | block/blk-mq.c | 9 | 
1 files changed, 5 insertions, 4 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c index 159187a28d66..a4546f060e80 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1434,7 +1434,8 @@ static blk_qc_t request_to_qc_t(struct blk_mq_hw_ctx *hctx, struct request *rq)  	return blk_tag_to_qc_t(rq->internal_tag, hctx->queue_num, true);  } -static void blk_mq_try_issue_directly(struct request *rq, blk_qc_t *cookie) +static void blk_mq_try_issue_directly(struct request *rq, blk_qc_t *cookie, +				      bool may_sleep)  {  	struct request_queue *q = rq->q;  	struct blk_mq_queue_data bd = { @@ -1475,7 +1476,7 @@ static void blk_mq_try_issue_directly(struct request *rq, blk_qc_t *cookie)  	}  insert: -	blk_mq_sched_insert_request(rq, false, true, true, false); +	blk_mq_sched_insert_request(rq, false, true, false, may_sleep);  }  /* @@ -1569,11 +1570,11 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio)  		if (!(data.hctx->flags & BLK_MQ_F_BLOCKING)) {  			rcu_read_lock(); -			blk_mq_try_issue_directly(old_rq, &cookie); +			blk_mq_try_issue_directly(old_rq, &cookie, false);  			rcu_read_unlock();  		} else {  			srcu_idx = srcu_read_lock(&data.hctx->queue_rq_srcu); -			blk_mq_try_issue_directly(old_rq, &cookie); +			blk_mq_try_issue_directly(old_rq, &cookie, true);  			srcu_read_unlock(&data.hctx->queue_rq_srcu, srcu_idx);  		}  		goto done;  |