block: remove init_mutex and open-code blk_iolatency_try_init
authorLi Lingfeng <lilingfeng3@huawei.com>
Thu, 10 Aug 2023 03:51:11 +0000 (11:51 +0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 10 Aug 2023 13:20:31 +0000 (07:20 -0600)
Commit a13696b83da4 ("blk-iolatency: Make initialization lazy") adds
a mutex named "init_mutex" in blk_iolatency_try_init for the race
condition of initializing RQ_QOS_LATENCY.
Now a new lock has been add to struct request_queue by commit a13bd91be223
("block/rq_qos: protect rq_qos apis with a new lock"). And it has been
held in blkg_conf_open_bdev before calling blk_iolatency_init.
So it's not necessary to keep init_mutex in blk_iolatency_try_init, just
remove it.

Since init_mutex has been removed, blk_iolatency_try_init can be
open-coded back to iolatency_set_limit() like ioc_qos_write().

Signed-off-by: Li Lingfeng <lilingfeng3@huawei.com>
Reviewed-by: Michal Koutný <mkoutny@suse.com>
Link: https://lore.kernel.org/r/20230810035111.2236335-1-lilingfeng@huaweicloud.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-iolatency.c

index fd5fec9..c16aef4 100644 (file)
@@ -824,29 +824,6 @@ static void iolatency_clear_scaling(struct blkcg_gq *blkg)
        }
 }
 
-static int blk_iolatency_try_init(struct blkg_conf_ctx *ctx)
-{
-       static DEFINE_MUTEX(init_mutex);
-       int ret;
-
-       ret = blkg_conf_open_bdev(ctx);
-       if (ret)
-               return ret;
-
-       /*
-        * blk_iolatency_init() may fail after rq_qos_add() succeeds which can
-        * confuse iolat_rq_qos() test. Make the test and init atomic.
-        */
-       mutex_lock(&init_mutex);
-
-       if (!iolat_rq_qos(ctx->bdev->bd_queue))
-               ret = blk_iolatency_init(ctx->bdev->bd_disk);
-
-       mutex_unlock(&init_mutex);
-
-       return ret;
-}
-
 static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf,
                             size_t nbytes, loff_t off)
 {
@@ -861,7 +838,17 @@ static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf,
 
        blkg_conf_init(&ctx, buf);
 
-       ret = blk_iolatency_try_init(&ctx);
+       ret = blkg_conf_open_bdev(&ctx);
+       if (ret)
+               goto out;
+
+       /*
+        * blk_iolatency_init() may fail after rq_qos_add() succeeds which can
+        * confuse iolat_rq_qos() test. Make the test and init atomic.
+        */
+       lockdep_assert_held(ctx.bdev->bd_queue->rq_qos_mutex);
+       if (!iolat_rq_qos(ctx.bdev->bd_queue))
+               ret = blk_iolatency_init(ctx.bdev->bd_disk);
        if (ret)
                goto out;