aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
authorYu Kuai <yukuai@fygo.io>2026-06-08 11:42:46 +0800
committerJens Axboe <axboe@kernel.dk>2026-06-24 06:42:31 -0600
commit457d3c4f0fdd6cf8a4bd8115bf470809984a9f02 (patch)
treef2856a5fb261f7547b351d32411ae0f3633b3afd /block
parent9327a865e395a53f67dffac4710beb1d4730495e (diff)
downloadath-457d3c4f0fdd6cf8a4bd8115bf470809984a9f02.tar.gz
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>
Diffstat (limited to 'block')
-rw-r--r--block/blk-cgroup.c18
1 files changed, 11 insertions, 7 deletions
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);