All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] block: fix missing queue put in error path
@ 2021-11-15 21:35 Jens Axboe
  2021-11-15 23:57 ` Ming Lei
  0 siblings, 1 reply; 2+ messages in thread
From: Jens Axboe @ 2021-11-15 21:35 UTC (permalink / raw)
  To: linux-block; +Cc: Stephen Smith, Ming Lei

If we fail the submission queue checks, we don't put the queue afterwards.
This can cause various issues like stalls on scheduler switch or failure
to remove the device, or like in the original bug report, timeout waiting
for the device on reboot/restart.

While in there, fix a few whitespace discrepancies in the surrounding
code.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=215039
Fixes: b637108a4022 ("blk-mq: fix filesystem I/O request allocation")
Reported-and-tested-by: Stephen Smith <stephenmsmith@blueyonder.co.uk>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

---

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 3ab34c4f20da..5e1c9fd99353 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -2543,8 +2543,7 @@ static struct request *blk_mq_get_new_requests(struct request_queue *q,
 	return NULL;
 }
 
-static inline bool blk_mq_can_use_cached_rq(struct request *rq,
-		struct bio *bio)
+static inline bool blk_mq_can_use_cached_rq(struct request *rq, struct bio *bio)
 {
 	if (blk_mq_get_hctx_type(bio->bi_opf) != rq->mq_hctx->type)
 		return false;
@@ -2565,7 +2564,6 @@ static inline struct request *blk_mq_get_request(struct request_queue *q,
 	bool checked = false;
 
 	if (plug) {
-
 		rq = rq_list_peek(&plug->cached_rq);
 		if (rq && rq->q == q) {
 			if (unlikely(!submit_bio_checks(bio)))
@@ -2587,12 +2585,14 @@ static inline struct request *blk_mq_get_request(struct request_queue *q,
 fallback:
 	if (unlikely(bio_queue_enter(bio)))
 		return NULL;
-	if (!checked && !submit_bio_checks(bio))
-		return NULL;
+	if (unlikely(!checked && !submit_bio_checks(bio)))
+		goto out_put;
 	rq = blk_mq_get_new_requests(q, plug, bio, nsegs, same_queue_rq);
-	if (!rq)
-		blk_queue_exit(q);
-	return rq;
+	if (rq)
+		return rq;
+out_put:
+	blk_queue_exit(q);
+	return NULL;
 }
 
 /**

-- 
Jens Axboe


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] block: fix missing queue put in error path
  2021-11-15 21:35 [PATCH] block: fix missing queue put in error path Jens Axboe
@ 2021-11-15 23:57 ` Ming Lei
  0 siblings, 0 replies; 2+ messages in thread
From: Ming Lei @ 2021-11-15 23:57 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block, Stephen Smith

On Mon, Nov 15, 2021 at 02:35:09PM -0700, Jens Axboe wrote:
> If we fail the submission queue checks, we don't put the queue afterwards.
> This can cause various issues like stalls on scheduler switch or failure
> to remove the device, or like in the original bug report, timeout waiting
> for the device on reboot/restart.
> 
> While in there, fix a few whitespace discrepancies in the surrounding
> code.
> 
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=215039
> Fixes: b637108a4022 ("blk-mq: fix filesystem I/O request allocation")
> Reported-and-tested-by: Stephen Smith <stephenmsmith@blueyonder.co.uk>
> Signed-off-by: Jens Axboe <axboe@kernel.dk>
> 
> ---
> 
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 3ab34c4f20da..5e1c9fd99353 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -2543,8 +2543,7 @@ static struct request *blk_mq_get_new_requests(struct request_queue *q,
>  	return NULL;
>  }
>  
> -static inline bool blk_mq_can_use_cached_rq(struct request *rq,
> -		struct bio *bio)
> +static inline bool blk_mq_can_use_cached_rq(struct request *rq, struct bio *bio)
>  {
>  	if (blk_mq_get_hctx_type(bio->bi_opf) != rq->mq_hctx->type)
>  		return false;
> @@ -2565,7 +2564,6 @@ static inline struct request *blk_mq_get_request(struct request_queue *q,
>  	bool checked = false;
>  
>  	if (plug) {
> -
>  		rq = rq_list_peek(&plug->cached_rq);
>  		if (rq && rq->q == q) {
>  			if (unlikely(!submit_bio_checks(bio)))
> @@ -2587,12 +2585,14 @@ static inline struct request *blk_mq_get_request(struct request_queue *q,
>  fallback:
>  	if (unlikely(bio_queue_enter(bio)))
>  		return NULL;
> -	if (!checked && !submit_bio_checks(bio))
> -		return NULL;
> +	if (unlikely(!checked && !submit_bio_checks(bio)))
> +		goto out_put;
>  	rq = blk_mq_get_new_requests(q, plug, bio, nsegs, same_queue_rq);
> -	if (!rq)
> -		blk_queue_exit(q);
> -	return rq;
> +	if (rq)
> +		return rq;
> +out_put:
> +	blk_queue_exit(q);
> +	return NULL;

Reviewed-by: Ming Lei <ming.lei@redhat.com>

-- 
Ming


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-11-16  0:00 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-15 21:35 [PATCH] block: fix missing queue put in error path Jens Axboe
2021-11-15 23:57 ` Ming Lei

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.