[<prev] [next>] [day] [month] [year] [list]
Message-Id: <20251116024134.115685-5-yukuai@fnnas.com>
Date: Sun, 16 Nov 2025 10:41:33 +0800
From: "Yu Kuai" <yukuai@...as.com>
To: <axboe@...nel.dk>, <linux-block@...r.kernel.org>,
<linux-kernel@...r.kernel.org>, <tj@...nel.org>, <nilay@...ux.ibm.com>,
<ming.lei@...hat.com>
Cc: <yukuai@...as.com>
Subject: [PATCH 4/5] blk-iolatency: fix incorrect lock order for rq_qos_mutex and freeze queue
Currently blk-iolatency will hold rq_qos_mutex first and then call
rq_qos_add() to freeze queue.
Fix this problem by converting to use blkg_conf_open_bdev_frozen()
from iolatency_set_limit(), and convert to use rq_qos_add_freezed().
Signed-off-by: Yu Kuai <yukuai@...as.com>
---
block/blk-iolatency.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/block/blk-iolatency.c b/block/blk-iolatency.c
index 45bd18f68541..1565352b176d 100644
--- a/block/blk-iolatency.c
+++ b/block/blk-iolatency.c
@@ -764,8 +764,8 @@ static int blk_iolatency_init(struct gendisk *disk)
if (!blkiolat)
return -ENOMEM;
- ret = rq_qos_add(&blkiolat->rqos, disk, RQ_QOS_LATENCY,
- &blkcg_iolatency_ops);
+ ret = rq_qos_add_freezed(&blkiolat->rqos, disk, RQ_QOS_LATENCY,
+ &blkcg_iolatency_ops);
if (ret)
goto err_free;
ret = blkcg_activate_policy(disk, &blkcg_policy_iolatency);
@@ -831,16 +831,19 @@ static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf,
struct blkcg_gq *blkg;
struct blkg_conf_ctx ctx;
struct iolatency_grp *iolat;
+ unsigned long memflags;
char *p, *tok;
u64 lat_val = 0;
u64 oldval;
- int ret;
+ int ret = 0;
blkg_conf_init(&ctx, buf);
- ret = blkg_conf_open_bdev(&ctx);
- if (ret)
+ memflags = blkg_conf_open_bdev_frozen(&ctx);
+ if (IS_ERR_VALUE(memflags)) {
+ ret = memflags;
goto out;
+ }
/*
* blk_iolatency_init() may fail after rq_qos_add() succeeds which can
@@ -890,7 +893,7 @@ static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf,
iolatency_clear_scaling(blkg);
ret = 0;
out:
- blkg_conf_exit(&ctx);
+ blkg_conf_exit_frozen(&ctx, memflags);
return ret ?: nbytes;
}
--
2.51.0
Powered by blists - more mailing lists