diff mbox series

[1/2] blk-mq: don't grab ->q_usage_counter in blk_mq_sched_bio_merge

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

Commit Message

Ming Lei Nov. 11, 2021, 8:51 a.m. UTC
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(-)

Comments

Christoph Hellwig Nov. 11, 2021, 8:56 a.m. UTC | #1
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 mbox series

Patch

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;
 }