summaryrefslogtreecommitdiff
path: root/block/blk-sysfs.c
diff options
context:
space:
mode:
authorYu Kuai2026-02-02 16:05:16 +0800
committerJens Axboe2026-02-02 07:05:19 -0700
commit2751b90051a0211ed7c78f26eb2a9b7038804b9b (patch)
tree839206ae0680c546994c46f7befa5d76f8c9110a /block/blk-sysfs.c
parent06564bae93d024e346c49304dfb4e2aaa68cf620 (diff)
blk-wbt: factor out a helper wbt_set_lat()
To move implementation details inside blk-wbt.c, prepare to fix possible deadlock to call wbt_init() while queue is frozen in the next patch. Reviewed-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Nilay Shroff <nilay@linux.ibm.com> Signed-off-by: Yu Kuai <yukuai@fnnas.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-sysfs.c')
-rw-r--r--block/blk-sysfs.c39
1 files changed, 2 insertions, 37 deletions
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index e0a70d26972b..a580688c3ad5 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -636,11 +636,8 @@ out:
static ssize_t queue_wb_lat_store(struct gendisk *disk, const char *page,
size_t count)
{
- struct request_queue *q = disk->queue;
- struct rq_qos *rqos;
ssize_t ret;
s64 val;
- unsigned int memflags;
ret = queue_var_store64(&val, page);
if (ret < 0)
@@ -648,40 +645,8 @@ static ssize_t queue_wb_lat_store(struct gendisk *disk, const char *page,
if (val < -1)
return -EINVAL;
- /*
- * Ensure that the queue is idled, in case the latency update
- * ends up either enabling or disabling wbt completely. We can't
- * have IO inflight if that happens.
- */
- memflags = blk_mq_freeze_queue(q);
-
- rqos = wbt_rq_qos(q);
- if (!rqos) {
- ret = wbt_init(disk);
- if (ret)
- goto out;
- }
-
- ret = count;
- if (val == -1)
- val = wbt_default_latency_nsec(q);
- else if (val >= 0)
- val *= 1000ULL;
-
- if (wbt_get_min_lat(q) == val)
- goto out;
-
- blk_mq_quiesce_queue(q);
-
- mutex_lock(&disk->rqos_state_mutex);
- wbt_set_min_lat(q, val);
- mutex_unlock(&disk->rqos_state_mutex);
-
- blk_mq_unquiesce_queue(q);
-out:
- blk_mq_unfreeze_queue(q, memflags);
-
- return ret;
+ ret = wbt_set_lat(disk, val);
+ return ret ? ret : count;
}
QUEUE_RW_ENTRY(queue_wb_lat, "wbt_lat_usec");