* [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.