diff mbox

blk-mq-sched: add might_sleep() check for flush/fua insert

Message ID cd6d3a9a-8f6d-1cf8-6379-51de69544c1d@kernel.dk (mailing list archive)
State New, archived
Headers show

Commit Message

Jens Axboe April 20, 2017, 10:45 p.m. UTC
If we're doing a flush/fua insert, insertion might block on getting
a driver tag, if can_block == true. Add a might_sleep check for that,
since we just had a bug like that. This will help us catch a similar
issue quicker in the future.


Signed-off-by: Jens Axboe <axboe@fb.com>

Comments

Bart Van Assche April 20, 2017, 10:57 p.m. UTC | #1
On Thu, 2017-04-20 at 16:45 -0600, Jens Axboe wrote:
> If we're doing a flush/fua insert, insertion might block on getting
> a driver tag, if can_block == true. Add a might_sleep check for that,
> since we just had a bug like that. This will help us catch a similar
> issue quicker in the future.
> 
> diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c
> index 9e3c0f92851b..57aec8462e93 100644
> --- a/block/blk-mq-sched.c
> +++ b/block/blk-mq-sched.c
> @@ -372,6 +372,7 @@ void blk_mq_sched_insert_request(struct request *rq, bool at_head,
>  	struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, ctx->cpu);
>  
>  	if (rq->tag == -1 && op_is_flush(rq->cmd_flags)) {
> +		might_sleep_if(can_block);
>  		blk_mq_sched_insert_flush(hctx, rq, can_block);
>  		return;
>  	}

Hello Jens,

The above patch looks fine to me. But seeing that patch made me wonder
whether it would be useful to move that might_sleep_if() call into
blk_mq_get_driver_tag() such that if ever an additional call to
blk_mq_get_driver_tag() is added that might sleep would also be covered?

Bart.
diff mbox

Patch

diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c
index 9e3c0f92851b..57aec8462e93 100644
--- a/block/blk-mq-sched.c
+++ b/block/blk-mq-sched.c
@@ -372,6 +372,7 @@  void blk_mq_sched_insert_request(struct request *rq, bool at_head,
 	struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, ctx->cpu);
 
 	if (rq->tag == -1 && op_is_flush(rq->cmd_flags)) {
+		might_sleep_if(can_block);
 		blk_mq_sched_insert_flush(hctx, rq, can_block);
 		return;
 	}