Commit 4eb44d10 authored by Li Lingfeng's avatar Li Lingfeng Committed by Jens Axboe
Browse files

block: remove init_mutex and open-code blk_iolatency_try_init



Commit a13696b8 ("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 a13bd91b
("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: default avatarLi Lingfeng <lilingfeng3@huawei.com>
Reviewed-by: default avatarMichal Koutný <mkoutny@suse.com>
Link: https://lore.kernel.org/r/20230810035111.2236335-1-lilingfeng@huaweicloud.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent c8659bbb
Loading
Loading
Loading
Loading
+11 −24
Original line number Diff line number Diff line
@@ -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;