Because blk_mq_hw_queue_need_run() now returns false if a queue is frozen, protecting request queue changes with blk_mq_quiesce_queue() and blk_mq_unquiesce_queue() while a queue is frozen is no longer necessary. Hence this patch that removes quiesce/unquiesce calls on frozen queues. Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx> --- block/blk-iocost.c | 8 -------- block/blk-mq.c | 4 ---- block/blk-sysfs.c | 13 +++++-------- block/blk-throttle.c | 2 -- block/elevator.c | 8 ++------ 5 files changed, 7 insertions(+), 28 deletions(-) diff --git a/block/blk-iocost.c b/block/blk-iocost.c index 5bfd70311359..e567d8480569 100644 --- a/block/blk-iocost.c +++ b/block/blk-iocost.c @@ -3248,8 +3248,6 @@ static ssize_t ioc_qos_write(struct kernfs_open_file *of, char *input, ioc = q_to_ioc(disk->queue); } - blk_mq_quiesce_queue(disk->queue); - spin_lock_irq(&ioc->lock); memcpy(qos, ioc->params.qos, sizeof(qos)); enable = ioc->enabled; @@ -3346,13 +3344,10 @@ static ssize_t ioc_qos_write(struct kernfs_open_file *of, char *input, else wbt_enable_default(disk); - blk_mq_unquiesce_queue(disk->queue); - blkg_conf_exit_frozen(&ctx, memflags); return nbytes; einval: spin_unlock_irq(&ioc->lock); - blk_mq_unquiesce_queue(disk->queue); ret = -EINVAL; err: blkg_conf_exit_frozen(&ctx, memflags); @@ -3439,7 +3434,6 @@ static ssize_t ioc_cost_model_write(struct kernfs_open_file *of, char *input, } memflags = blk_mq_freeze_queue(q); - blk_mq_quiesce_queue(q); spin_lock_irq(&ioc->lock); memcpy(u, ioc->params.i_lcoefs, sizeof(u)); @@ -3489,7 +3483,6 @@ static ssize_t ioc_cost_model_write(struct kernfs_open_file *of, char *input, ioc_refresh_params(ioc, true); spin_unlock_irq(&ioc->lock); - blk_mq_unquiesce_queue(q); blk_mq_unfreeze_queue(q, memflags); blkg_conf_exit(&ctx); @@ -3498,7 +3491,6 @@ static ssize_t ioc_cost_model_write(struct kernfs_open_file *of, char *input, einval: spin_unlock_irq(&ioc->lock); - blk_mq_unquiesce_queue(q); blk_mq_unfreeze_queue(q, memflags); ret = -EINVAL; diff --git a/block/blk-mq.c b/block/blk-mq.c index 91b9fc1a7ddb..b84ff8e4e17e 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -4932,8 +4932,6 @@ int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr) if (q->nr_requests == nr) return 0; - blk_mq_quiesce_queue(q); - ret = 0; queue_for_each_hw_ctx(q, hctx, i) { if (!hctx->tags) @@ -4964,8 +4962,6 @@ int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr) } } - blk_mq_unquiesce_queue(q); - return ret; } diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 1f63b184c6e9..dd11d7f1c600 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -593,6 +593,11 @@ 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); @@ -611,18 +616,10 @@ static ssize_t queue_wb_lat_store(struct gendisk *disk, const char *page, if (wbt_get_min_lat(q) == val) goto out; - /* - * 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. - */ - 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); diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 397b6a410f9e..9abcdbfe91e1 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -1332,7 +1332,6 @@ static int blk_throtl_init(struct gendisk *disk) * which is protected by 'q_usage_counter'. */ memflags = blk_mq_freeze_queue(disk->queue); - blk_mq_quiesce_queue(disk->queue); q->td = td; td->queue = q; @@ -1354,7 +1353,6 @@ static int blk_throtl_init(struct gendisk *disk) blk_stat_enable_accounting(q); out: - blk_mq_unquiesce_queue(disk->queue); blk_mq_unfreeze_queue(disk->queue, memflags); return ret; diff --git a/block/elevator.c b/block/elevator.c index ab22542e6cf0..574b35f8c01c 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -584,8 +584,6 @@ static int elevator_switch(struct request_queue *q, struct elv_change_ctx *ctx) return -EINVAL; } - blk_mq_quiesce_queue(q); - if (q->elevator) { ctx->old = q->elevator; elevator_exit(q); @@ -594,7 +592,7 @@ static int elevator_switch(struct request_queue *q, struct elv_change_ctx *ctx) if (new_e) { ret = blk_mq_init_sched(q, new_e); if (ret) - goto out_unfreeze; + goto out; ctx->new = q->elevator; } else { blk_queue_flag_clear(QUEUE_FLAG_SQ_SCHED, q); @@ -603,9 +601,7 @@ static int elevator_switch(struct request_queue *q, struct elv_change_ctx *ctx) } blk_add_trace_msg(q, "elv switch: %s", ctx->name); -out_unfreeze: - blk_mq_unquiesce_queue(q); - +out: if (ret) { pr_warn("elv: switch to \"%s\" failed, falling back to \"none\"\n", new_e->elevator_name);