]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
blk-cgroup: don't nest queue_lock under rcu in bio_associate_blkg()
authorYu Kuai <yukuai@fygo.io>
Mon, 8 Jun 2026 03:42:46 +0000 (11:42 +0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 24 Jun 2026 12:42:31 +0000 (06:42 -0600)
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>
block/blk-cgroup.c

index fee8c9d5dc2c0fb21ac040db56d1b376733b0983..e1bde48852ae13f1dcfff18139e61b178c7bd0b6 100644 (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);