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 <yukuai@fygo.io>
Link: https://patch.msgid.link/8496fa234b21d4b31b7f068766906d0bffcac8e6.1780621988.git.yukuai@fygo.io
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Yu Kuai 2026-06-08 11:42:46 +08:00 committed by Jens Axboe
parent 9327a865e3
commit 457d3c4f0f

View File

@ -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);