blkcg: Drop unnecessary RCU read [un]locks from blkg_conf_prep/finish()
authorTejun Heo <tj@kernel.org>
Thu, 13 Apr 2023 00:06:46 +0000 (14:06 -1000)
committerJens Axboe <axboe@kernel.dk>
Thu, 13 Apr 2023 12:46:48 +0000 (06:46 -0600)
Now that all RCU flavors have been combined either holding a spin lock,
disabling irq or disabling preemption implies RCU read lock, so there's no
need to use rcu_read_[un]lock() explicitly while holding queue_lock. This
shouldn't cause any behavior changes.

v2: Description updated. Leave __acquires/release on queue_lock alone.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20230413000649.115785-2-tj@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-cgroup.c

index 18331cb92914ef0b3cf1a55eff929e32c12e17a3..0a2c19d74d950e1eca023f92d2f5ae796a0e978f 100644 (file)
@@ -699,12 +699,12 @@ struct block_device *blkcg_conf_open_bdev(char **inputp)
  *
  * Parse per-blkg config update from @input and initialize @ctx with the
  * result.  @ctx->blkg points to the blkg to be updated and @ctx->body the
- * part of @input following MAJ:MIN.  This function returns with RCU read
- * lock and queue lock held and must be paired with blkg_conf_finish().
+ * part of @input following MAJ:MIN.  This function returns with queue lock
+ * held and must be paired with blkg_conf_finish().
  */
 int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
                   char *input, struct blkg_conf_ctx *ctx)
-       __acquires(rcu) __acquires(&bdev->bd_queue->queue_lock)
+       __acquires(&bdev->bd_queue->queue_lock)
 {
        struct block_device *bdev;
        struct gendisk *disk;
@@ -726,7 +726,6 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
        if (ret)
                goto fail;
 
-       rcu_read_lock();
        spin_lock_irq(&q->queue_lock);
 
        if (!blkcg_policy_enabled(q, pol)) {
@@ -755,7 +754,6 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
 
                /* Drop locks to do new blkg allocation with GFP_KERNEL. */
                spin_unlock_irq(&q->queue_lock);
-               rcu_read_unlock();
 
                new_blkg = blkg_alloc(pos, disk, GFP_KERNEL);
                if (unlikely(!new_blkg)) {
@@ -769,7 +767,6 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
                        goto fail_exit_queue;
                }
 
-               rcu_read_lock();
                spin_lock_irq(&q->queue_lock);
 
                if (!blkcg_policy_enabled(q, pol)) {
@@ -805,7 +802,6 @@ fail_preloaded:
        radix_tree_preload_end();
 fail_unlock:
        spin_unlock_irq(&q->queue_lock);
-       rcu_read_unlock();
 fail_exit_queue:
        blk_queue_exit(q);
 fail:
@@ -832,10 +828,9 @@ EXPORT_SYMBOL_GPL(blkg_conf_prep);
  * with blkg_conf_prep().
  */
 void blkg_conf_finish(struct blkg_conf_ctx *ctx)
-       __releases(&ctx->bdev->bd_queue->queue_lock) __releases(rcu)
+       __releases(&ctx->bdev->bd_queue->queue_lock)
 {
        spin_unlock_irq(&bdev_get_queue(ctx->bdev)->queue_lock);
-       rcu_read_unlock();
        blkdev_put_no_open(ctx->bdev);
 }
 EXPORT_SYMBOL_GPL(blkg_conf_finish);