From: Yu Kuai Date: Mon, 8 Jun 2026 03:42:46 +0000 (+0800) Subject: blk-cgroup: don't nest queue_lock under rcu in bio_associate_blkg() X-Git-Tag: v7.2-rc1~31^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=457d3c4f0fdd6cf8a4bd8115bf470809984a9f02;p=thirdparty%2Flinux.git blk-cgroup: don't nest queue_lock under rcu in bio_associate_blkg() If a bio is already associated with a blkg, the blkcg is already pinned until the bio is done, so there is no need for RCU protection. Otherwise, protect blkcg_css() with RCU independently. Prepare to protect blkcg with blkcg_mutex instead of queue_lock. Signed-off-by: Yu Kuai Link: https://patch.msgid.link/8496fa234b21d4b31b7f068766906d0bffcac8e6.1780621988.git.yukuai@fygo.io Signed-off-by: Jens Axboe --- diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index fee8c9d5dc2c0..e1bde48852ae1 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c @@ -2134,16 +2134,20 @@ void bio_associate_blkg(struct bio *bio) if (blk_op_is_passthrough(bio->bi_opf)) return; - rcu_read_lock(); - - if (bio->bi_blkg) + if (bio->bi_blkg) { css = bio_blkcg_css(bio); - else + bio_associate_blkg_from_css(bio, css); + } else { + rcu_read_lock(); css = blkcg_css(); + if (!css_tryget_online(css)) + css = NULL; + rcu_read_unlock(); - bio_associate_blkg_from_css(bio, css); - - rcu_read_unlock(); + bio_associate_blkg_from_css(bio, css); + if (css) + css_put(css); + } } EXPORT_SYMBOL_GPL(bio_associate_blkg);