diff options
| author | Christoph Hellwig <hch@lst.de> | 2025-05-05 22:17:49 +0800 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2025-05-06 07:43:43 -0600 |
| commit | 1bb7fba0e262e71f9355dc46c10b9da3c92f3d2b (patch) | |
| tree | a42a8d6bcfc47f3d0055d59e1793e6cfe578a533 /block | |
| parent | block: look up the elevator type in elevator_switch (diff) | |
| download | linux-1bb7fba0e262e71f9355dc46c10b9da3c92f3d2b.tar.gz linux-1bb7fba0e262e71f9355dc46c10b9da3c92f3d2b.zip | |
block: fold elevator_disable into elevator_switch
This removes duplicate code, and keeps the callers tidy.
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20250505141805.2751237-12-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
| -rw-r--r-- | block/elevator.c | 61 |
1 files changed, 23 insertions, 38 deletions
diff --git a/block/elevator.c b/block/elevator.c index 286d240a3aef..766deaf34214 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -623,15 +623,17 @@ void elevator_init_mq(struct request_queue *q) */ int elevator_switch(struct request_queue *q, const char *name) { - struct elevator_type *new_e; - int ret; + struct elevator_type *new_e = NULL; + int ret = 0; WARN_ON_ONCE(q->mq_freeze_depth == 0); lockdep_assert_held(&q->elevator_lock); - new_e = elevator_find_get(name); - if (!new_e) - return -EINVAL; + if (strncmp(name, "none", 4)) { + new_e = elevator_find_get(name); + if (!new_e) + return -EINVAL; + } blk_mq_quiesce_queue(q); @@ -640,16 +642,21 @@ int elevator_switch(struct request_queue *q, const char *name) elevator_exit(q); } - ret = blk_mq_init_sched(q, new_e); - if (ret) - goto out_unfreeze; - - ret = elv_register_queue(q, true); - if (ret) { - elevator_exit(q); - goto out_unfreeze; + if (new_e) { + ret = blk_mq_init_sched(q, new_e); + if (ret) + goto out_unfreeze; + ret = elv_register_queue(q, true); + if (ret) { + elevator_exit(q); + goto out_unfreeze; + } + } else { + blk_queue_flag_clear(QUEUE_FLAG_SQ_SCHED, q); + q->elevator = NULL; + q->nr_requests = q->tag_set->queue_depth; } - blk_add_trace_msg(q, "elv switch: %s", new_e->elevator_name); + blk_add_trace_msg(q, "elv switch: %s", name); out_unfreeze: blk_mq_unquiesce_queue(q); @@ -659,27 +666,11 @@ out_unfreeze: new_e->elevator_name); } - elevator_put(new_e); + if (new_e) + elevator_put(new_e); return ret; } -void elevator_disable(struct request_queue *q) -{ - WARN_ON_ONCE(q->mq_freeze_depth == 0); - lockdep_assert_held(&q->elevator_lock); - - blk_mq_quiesce_queue(q); - - elv_unregister_queue(q); - elevator_exit(q); - blk_queue_flag_clear(QUEUE_FLAG_SQ_SCHED, q); - q->elevator = NULL; - q->nr_requests = q->tag_set->queue_depth; - blk_add_trace_msg(q, "elv switch: none"); - - blk_mq_unquiesce_queue(q); -} - /* * Switch this queue to the given IO scheduler. */ @@ -689,12 +680,6 @@ static int elevator_change(struct request_queue *q, const char *elevator_name) if (!blk_queue_registered(q)) return -ENOENT; - if (!strncmp(elevator_name, "none", 4)) { - if (q->elevator) - elevator_disable(q); - return 0; - } - if (q->elevator && elevator_match(q->elevator->type, elevator_name)) return 0; |
