Message ID | 20211111085134.345235-2-ming.lei@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | blk-mq: fix hang in blk_mq_freeze_queue_wait | expand |
On Thu, Nov 11, 2021 at 04:51:33PM +0800, Ming Lei wrote: > blk_mq_sched_bio_merge is only called from blk-mq.c:blk_attempt_bio_merge(), > which is called when queue usage counter is grabbed already: > > 1) blk_mq_get_new_requests() > > 2) blk_mq_get_request() > - cached request in current plug owns one queue usage counter > > So don't grab ->q_usage_counter in blk_mq_sched_bio_merge(), and more > importantly this nest way causes hang in blk_mq_freeze_queue_wait(). Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de>
diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c index 4be652fa38e7..ba21449439cc 100644 --- a/block/blk-mq-sched.c +++ b/block/blk-mq-sched.c @@ -370,9 +370,6 @@ bool blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio, bool ret = false; enum hctx_type type; - if (bio_queue_enter(bio)) - return false; - if (e && e->type->ops.bio_merge) { ret = e->type->ops.bio_merge(q, bio, nr_segs); goto out_put; @@ -397,7 +394,6 @@ bool blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio, spin_unlock(&ctx->lock); out_put: - blk_queue_exit(q); return ret; }
blk_mq_sched_bio_merge is only called from blk-mq.c:blk_attempt_bio_merge(), which is called when queue usage counter is grabbed already: 1) blk_mq_get_new_requests() 2) blk_mq_get_request() - cached request in current plug owns one queue usage counter So don't grab ->q_usage_counter in blk_mq_sched_bio_merge(), and more importantly this nest way causes hang in blk_mq_freeze_queue_wait(). Cc: Christoph Hellwig <hch@lst.de> Signed-off-by: Ming Lei <ming.lei@redhat.com> --- block/blk-mq-sched.c | 4 ---- 1 file changed, 4 deletions(-)