All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] block: don't call rq_qos_ops->done_bio if the bio isn't tracked
@ 2021-09-24 11:07 Ming Lei
  2021-09-24 15:56 ` Christoph Hellwig
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Ming Lei @ 2021-09-24 11:07 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block, Ming Lei, Yu Kuai, tj

rq_qos framework is only applied on request based driver, so:

1) rq_qos_done_bio() needn't to be called for bio based driver

2) rq_qos_done_bio() needn't to be called for bio which isn't tracked,
such as bios ended from error handling code.

Especially in bio_endio():

1) request queue is referred via bio->bi_bdev->bd_disk->queue, which
may be gone since request queue refcount may not be held in above two
cases

2) q->rq_qos may be freed in blk_cleanup_queue() when calling into
__rq_qos_done_bio()

Fix the potential kernel panic by not calling rq_qos_ops->done_bio if
the bio isn't tracked. This way is safe because both ioc_rqos_done_bio()
and blkcg_iolatency_done_bio() are nop if the bio isn't tracked.

Reported-by: Yu Kuai <yukuai3@huawei.com>
Cc: tj@kernel.org
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 block/bio.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/block/bio.c b/block/bio.c
index 5df3dd282e40..a6fb6a0b4295 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1466,7 +1466,7 @@ void bio_endio(struct bio *bio)
 	if (!bio_integrity_endio(bio))
 		return;
 
-	if (bio->bi_bdev)
+	if (bio->bi_bdev && bio_flagged(bio, BIO_TRACKED))
 		rq_qos_done_bio(bio->bi_bdev->bd_disk->queue, bio);
 
 	if (bio->bi_bdev && bio_flagged(bio, BIO_TRACE_COMPLETION)) {
-- 
2.31.1


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

* Re: [PATCH] block: don't call rq_qos_ops->done_bio if the bio isn't tracked
  2021-09-24 11:07 [PATCH] block: don't call rq_qos_ops->done_bio if the bio isn't tracked Ming Lei
@ 2021-09-24 15:56 ` Christoph Hellwig
  2021-09-24 16:57 ` Tejun Heo
  2021-09-24 17:04 ` Jens Axboe
  2 siblings, 0 replies; 4+ messages in thread
From: Christoph Hellwig @ 2021-09-24 15:56 UTC (permalink / raw)
  To: Ming Lei; +Cc: Jens Axboe, linux-block, Yu Kuai, tj

On Fri, Sep 24, 2021 at 07:07:04PM +0800, Ming Lei wrote:
> rq_qos framework is only applied on request based driver, so:
> 
> 1) rq_qos_done_bio() needn't to be called for bio based driver
> 
> 2) rq_qos_done_bio() needn't to be called for bio which isn't tracked,
> such as bios ended from error handling code.
> 
> Especially in bio_endio():
> 
> 1) request queue is referred via bio->bi_bdev->bd_disk->queue, which
> may be gone since request queue refcount may not be held in above two
> cases
> 
> 2) q->rq_qos may be freed in blk_cleanup_queue() when calling into
> __rq_qos_done_bio()
> 
> Fix the potential kernel panic by not calling rq_qos_ops->done_bio if
> the bio isn't tracked. This way is safe because both ioc_rqos_done_bio()
> and blkcg_iolatency_done_bio() are nop if the bio isn't tracked.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

> @@ -1466,7 +1466,7 @@ void bio_endio(struct bio *bio)
>  	if (!bio_integrity_endio(bio))
>  		return;
>  
> -	if (bio->bi_bdev)
> +	if (bio->bi_bdev && bio_flagged(bio, BIO_TRACKED))
>  		rq_qos_done_bio(bio->bi_bdev->bd_disk->queue, bio);

We should probbly also drop the request_queue argument to
rq_qos_done_bio in a separate cleanup.

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

* Re: [PATCH] block: don't call rq_qos_ops->done_bio if the bio isn't tracked
  2021-09-24 11:07 [PATCH] block: don't call rq_qos_ops->done_bio if the bio isn't tracked Ming Lei
  2021-09-24 15:56 ` Christoph Hellwig
@ 2021-09-24 16:57 ` Tejun Heo
  2021-09-24 17:04 ` Jens Axboe
  2 siblings, 0 replies; 4+ messages in thread
From: Tejun Heo @ 2021-09-24 16:57 UTC (permalink / raw)
  To: Ming Lei; +Cc: Jens Axboe, linux-block, Yu Kuai

On Fri, Sep 24, 2021 at 07:07:04PM +0800, Ming Lei wrote:
> rq_qos framework is only applied on request based driver, so:
> 
> 1) rq_qos_done_bio() needn't to be called for bio based driver
> 
> 2) rq_qos_done_bio() needn't to be called for bio which isn't tracked,
> such as bios ended from error handling code.
> 
> Especially in bio_endio():
> 
> 1) request queue is referred via bio->bi_bdev->bd_disk->queue, which
> may be gone since request queue refcount may not be held in above two
> cases
> 
> 2) q->rq_qos may be freed in blk_cleanup_queue() when calling into
> __rq_qos_done_bio()
> 
> Fix the potential kernel panic by not calling rq_qos_ops->done_bio if
> the bio isn't tracked. This way is safe because both ioc_rqos_done_bio()
> and blkcg_iolatency_done_bio() are nop if the bio isn't tracked.
>
> Reported-by: Yu Kuai <yukuai3@huawei.com>
> Cc: tj@kernel.org
> Signed-off-by: Ming Lei <ming.lei@redhat.com>

Acked-by: Tejun Heo <tj@kernel.org>

Thanks.

-- 
tejun

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

* Re: [PATCH] block: don't call rq_qos_ops->done_bio if the bio isn't tracked
  2021-09-24 11:07 [PATCH] block: don't call rq_qos_ops->done_bio if the bio isn't tracked Ming Lei
  2021-09-24 15:56 ` Christoph Hellwig
  2021-09-24 16:57 ` Tejun Heo
@ 2021-09-24 17:04 ` Jens Axboe
  2 siblings, 0 replies; 4+ messages in thread
From: Jens Axboe @ 2021-09-24 17:04 UTC (permalink / raw)
  To: Ming Lei; +Cc: linux-block, Yu Kuai, tj

On 9/24/21 5:07 AM, Ming Lei wrote:
> rq_qos framework is only applied on request based driver, so:
> 
> 1) rq_qos_done_bio() needn't to be called for bio based driver
> 
> 2) rq_qos_done_bio() needn't to be called for bio which isn't tracked,
> such as bios ended from error handling code.
> 
> Especially in bio_endio():
> 
> 1) request queue is referred via bio->bi_bdev->bd_disk->queue, which
> may be gone since request queue refcount may not be held in above two
> cases
> 
> 2) q->rq_qos may be freed in blk_cleanup_queue() when calling into
> __rq_qos_done_bio()
> 
> Fix the potential kernel panic by not calling rq_qos_ops->done_bio if
> the bio isn't tracked. This way is safe because both ioc_rqos_done_bio()
> and blkcg_iolatency_done_bio() are nop if the bio isn't tracked.

Applied, thanks.

-- 
Jens Axboe


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

end of thread, other threads:[~2021-09-24 17:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-24 11:07 [PATCH] block: don't call rq_qos_ops->done_bio if the bio isn't tracked Ming Lei
2021-09-24 15:56 ` Christoph Hellwig
2021-09-24 16:57 ` Tejun Heo
2021-09-24 17:04 ` Jens Axboe

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.