Message ID | cd6d3a9a-8f6d-1cf8-6379-51de69544c1d@kernel.dk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 --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; }
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>