[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251116041024.120500-5-yukuai@fnnas.com>
Date: Sun, 16 Nov 2025 12:10:23 +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 RESEND 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