1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Block device elevator/IO-scheduler. 4 * 5 * Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE 6 * 7 * 30042000 Jens Axboe <axboe@kernel.dk> : 8 * 9 * Split the elevator a bit so that it is possible to choose a different 10 * one or even write a new "plug in". There are three pieces: 11 * - elevator_fn, inserts a new request in the queue list 12 * - elevator_merge_fn, decides whether a new buffer can be merged with 13 * an existing request 14 * - elevator_dequeue_fn, called when a request is taken off the active list 15 * 16 * 20082000 Dave Jones <davej@suse.de> : 17 * Removed tests for max-bomb-segments, which was breaking elvtune 18 * when run without -bN 19 * 20 * Jens: 21 * - Rework again to work with bio instead of buffer_heads 22 * - loose bi_dev comparisons, partition handling is right now 23 * - completely modularize elevator setup and teardown 24 * 25 */ 26 #include <linux/kernel.h> 27 #include <linux/fs.h> 28 #include <linux/blkdev.h> 29 #include <linux/bio.h> 30 #include <linux/module.h> 31 #include <linux/slab.h> 32 #include <linux/init.h> 33 #include <linux/compiler.h> 34 #include <linux/blktrace_api.h> 35 #include <linux/hash.h> 36 #include <linux/uaccess.h> 37 #include <linux/pm_runtime.h> 38 39 #include <trace/events/block.h> 40 41 #include "elevator.h" 42 #include "blk.h" 43 #include "blk-mq-sched.h" 44 #include "blk-pm.h" 45 #include "blk-wbt.h" 46 #include "blk-cgroup.h" 47 48 /* Holding context data for changing elevator */ 49 struct elv_change_ctx { 50 const char *name; 51 bool no_uevent; 52 53 /* for unregistering old elevator */ 54 struct elevator_queue *old; 55 /* for registering new elevator */ 56 struct elevator_queue *new; 57 }; 58 59 static DEFINE_SPINLOCK(elv_list_lock); 60 static LIST_HEAD(elv_list); 61 62 /* 63 * Merge hash stuff. 64 */ 65 #define rq_hash_key(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq)) 66 67 /* 68 * Query io scheduler to see if the current process issuing bio may be 69 * merged with rq. 70 */ 71 static bool elv_iosched_allow_bio_merge(struct request *rq, struct bio *bio) 72 { 73 struct request_queue *q = rq->q; 74 struct elevator_queue *e = q->elevator; 75 76 if (e->type->ops.allow_merge) 77 return e->type->ops.allow_merge(q, rq, bio); 78 79 return true; 80 } 81 82 /* 83 * can we safely merge with this request? 84 */ 85 bool elv_bio_merge_ok(struct request *rq, struct bio *bio) 86 { 87 if (!blk_rq_merge_ok(rq, bio)) 88 return false; 89 90 if (!elv_iosched_allow_bio_merge(rq, bio)) 91 return false; 92 93 return true; 94 } 95 EXPORT_SYMBOL(elv_bio_merge_ok); 96 97 /** 98 * elevator_match - Check whether @e's name or alias matches @name 99 * @e: Scheduler to test 100 * @name: Elevator name to test 101 * 102 * Return true if the elevator @e's name or alias matches @name. 103 */ 104 static bool elevator_match(const struct elevator_type *e, const char *name) 105 { 106 return !strcmp(e->elevator_name, name) || 107 (e->elevator_alias && !strcmp(e->elevator_alias, name)); 108 } 109 110 static struct elevator_type *__elevator_find(const char *name) 111 { 112 struct elevator_type *e; 113 114 list_for_each_entry(e, &elv_list, list) 115 if (elevator_match(e, name)) 116 return e; 117 return NULL; 118 } 119 120 static struct elevator_type *elevator_find_get(const char *name) 121 { 122 struct elevator_type *e; 123 124 spin_lock(&elv_list_lock); 125 e = __elevator_find(name); 126 if (e && (!elevator_tryget(e))) 127 e = NULL; 128 spin_unlock(&elv_list_lock); 129 return e; 130 } 131 132 static const struct kobj_type elv_ktype; 133 134 struct elevator_queue *elevator_alloc(struct request_queue *q, 135 struct elevator_type *e) 136 { 137 struct elevator_queue *eq; 138 139 eq = kzalloc_node(sizeof(*eq), GFP_KERNEL, q->node); 140 if (unlikely(!eq)) 141 return NULL; 142 143 __elevator_get(e); 144 eq->type = e; 145 kobject_init(&eq->kobj, &elv_ktype); 146 mutex_init(&eq->sysfs_lock); 147 hash_init(eq->hash); 148 149 return eq; 150 } 151 EXPORT_SYMBOL(elevator_alloc); 152 153 static void elevator_release(struct kobject *kobj) 154 { 155 struct elevator_queue *e; 156 157 e = container_of(kobj, struct elevator_queue, kobj); 158 elevator_put(e->type); 159 kfree(e); 160 } 161 162 static void elevator_exit(struct request_queue *q) 163 { 164 struct elevator_queue *e = q->elevator; 165 166 lockdep_assert_held(&q->elevator_lock); 167 168 ioc_clear_queue(q); 169 blk_mq_sched_free_rqs(q); 170 171 mutex_lock(&e->sysfs_lock); 172 blk_mq_exit_sched(q, e); 173 mutex_unlock(&e->sysfs_lock); 174 } 175 176 static inline void __elv_rqhash_del(struct request *rq) 177 { 178 hash_del(&rq->hash); 179 rq->rq_flags &= ~RQF_HASHED; 180 } 181 182 void elv_rqhash_del(struct request_queue *q, struct request *rq) 183 { 184 if (ELV_ON_HASH(rq)) 185 __elv_rqhash_del(rq); 186 } 187 EXPORT_SYMBOL_GPL(elv_rqhash_del); 188 189 void elv_rqhash_add(struct request_queue *q, struct request *rq) 190 { 191 struct elevator_queue *e = q->elevator; 192 193 BUG_ON(ELV_ON_HASH(rq)); 194 hash_add(e->hash, &rq->hash, rq_hash_key(rq)); 195 rq->rq_flags |= RQF_HASHED; 196 } 197 EXPORT_SYMBOL_GPL(elv_rqhash_add); 198 199 void elv_rqhash_reposition(struct request_queue *q, struct request *rq) 200 { 201 __elv_rqhash_del(rq); 202 elv_rqhash_add(q, rq); 203 } 204 205 struct request *elv_rqhash_find(struct request_queue *q, sector_t offset) 206 { 207 struct elevator_queue *e = q->elevator; 208 struct hlist_node *next; 209 struct request *rq; 210 211 hash_for_each_possible_safe(e->hash, rq, next, hash, offset) { 212 BUG_ON(!ELV_ON_HASH(rq)); 213 214 if (unlikely(!rq_mergeable(rq))) { 215 __elv_rqhash_del(rq); 216 continue; 217 } 218 219 if (rq_hash_key(rq) == offset) 220 return rq; 221 } 222 223 return NULL; 224 } 225 226 /* 227 * RB-tree support functions for inserting/lookup/removal of requests 228 * in a sorted RB tree. 229 */ 230 void elv_rb_add(struct rb_root *root, struct request *rq) 231 { 232 struct rb_node **p = &root->rb_node; 233 struct rb_node *parent = NULL; 234 struct request *__rq; 235 236 while (*p) { 237 parent = *p; 238 __rq = rb_entry(parent, struct request, rb_node); 239 240 if (blk_rq_pos(rq) < blk_rq_pos(__rq)) 241 p = &(*p)->rb_left; 242 else if (blk_rq_pos(rq) >= blk_rq_pos(__rq)) 243 p = &(*p)->rb_right; 244 } 245 246 rb_link_node(&rq->rb_node, parent, p); 247 rb_insert_color(&rq->rb_node, root); 248 } 249 EXPORT_SYMBOL(elv_rb_add); 250 251 void elv_rb_del(struct rb_root *root, struct request *rq) 252 { 253 BUG_ON(RB_EMPTY_NODE(&rq->rb_node)); 254 rb_erase(&rq->rb_node, root); 255 RB_CLEAR_NODE(&rq->rb_node); 256 } 257 EXPORT_SYMBOL(elv_rb_del); 258 259 struct request *elv_rb_find(struct rb_root *root, sector_t sector) 260 { 261 struct rb_node *n = root->rb_node; 262 struct request *rq; 263 264 while (n) { 265 rq = rb_entry(n, struct request, rb_node); 266 267 if (sector < blk_rq_pos(rq)) 268 n = n->rb_left; 269 else if (sector > blk_rq_pos(rq)) 270 n = n->rb_right; 271 else 272 return rq; 273 } 274 275 return NULL; 276 } 277 EXPORT_SYMBOL(elv_rb_find); 278 279 enum elv_merge elv_merge(struct request_queue *q, struct request **req, 280 struct bio *bio) 281 { 282 struct elevator_queue *e = q->elevator; 283 struct request *__rq; 284 285 /* 286 * Levels of merges: 287 * nomerges: No merges at all attempted 288 * noxmerges: Only simple one-hit cache try 289 * merges: All merge tries attempted 290 */ 291 if (blk_queue_nomerges(q) || !bio_mergeable(bio)) 292 return ELEVATOR_NO_MERGE; 293 294 /* 295 * First try one-hit cache. 296 */ 297 if (q->last_merge && elv_bio_merge_ok(q->last_merge, bio)) { 298 enum elv_merge ret = blk_try_merge(q->last_merge, bio); 299 300 if (ret != ELEVATOR_NO_MERGE) { 301 *req = q->last_merge; 302 return ret; 303 } 304 } 305 306 if (blk_queue_noxmerges(q)) 307 return ELEVATOR_NO_MERGE; 308 309 /* 310 * See if our hash lookup can find a potential backmerge. 311 */ 312 __rq = elv_rqhash_find(q, bio->bi_iter.bi_sector); 313 if (__rq && elv_bio_merge_ok(__rq, bio)) { 314 *req = __rq; 315 316 if (blk_discard_mergable(__rq)) 317 return ELEVATOR_DISCARD_MERGE; 318 return ELEVATOR_BACK_MERGE; 319 } 320 321 if (e->type->ops.request_merge) 322 return e->type->ops.request_merge(q, req, bio); 323 324 return ELEVATOR_NO_MERGE; 325 } 326 327 /* 328 * Attempt to do an insertion back merge. Only check for the case where 329 * we can append 'rq' to an existing request, so we can throw 'rq' away 330 * afterwards. 331 * 332 * Returns true if we merged, false otherwise. 'free' will contain all 333 * requests that need to be freed. 334 */ 335 bool elv_attempt_insert_merge(struct request_queue *q, struct request *rq, 336 struct list_head *free) 337 { 338 struct request *__rq; 339 bool ret; 340 341 if (blk_queue_nomerges(q)) 342 return false; 343 344 /* 345 * First try one-hit cache. 346 */ 347 if (q->last_merge && blk_attempt_req_merge(q, q->last_merge, rq)) { 348 list_add(&rq->queuelist, free); 349 return true; 350 } 351 352 if (blk_queue_noxmerges(q)) 353 return false; 354 355 ret = false; 356 /* 357 * See if our hash lookup can find a potential backmerge. 358 */ 359 while (1) { 360 __rq = elv_rqhash_find(q, blk_rq_pos(rq)); 361 if (!__rq || !blk_attempt_req_merge(q, __rq, rq)) 362 break; 363 364 list_add(&rq->queuelist, free); 365 /* The merged request could be merged with others, try again */ 366 ret = true; 367 rq = __rq; 368 } 369 370 return ret; 371 } 372 373 void elv_merged_request(struct request_queue *q, struct request *rq, 374 enum elv_merge type) 375 { 376 struct elevator_queue *e = q->elevator; 377 378 if (e->type->ops.request_merged) 379 e->type->ops.request_merged(q, rq, type); 380 381 if (type == ELEVATOR_BACK_MERGE) 382 elv_rqhash_reposition(q, rq); 383 384 q->last_merge = rq; 385 } 386 387 void elv_merge_requests(struct request_queue *q, struct request *rq, 388 struct request *next) 389 { 390 struct elevator_queue *e = q->elevator; 391 392 if (e->type->ops.requests_merged) 393 e->type->ops.requests_merged(q, rq, next); 394 395 elv_rqhash_reposition(q, rq); 396 q->last_merge = rq; 397 } 398 399 struct request *elv_latter_request(struct request_queue *q, struct request *rq) 400 { 401 struct elevator_queue *e = q->elevator; 402 403 if (e->type->ops.next_request) 404 return e->type->ops.next_request(q, rq); 405 406 return NULL; 407 } 408 409 struct request *elv_former_request(struct request_queue *q, struct request *rq) 410 { 411 struct elevator_queue *e = q->elevator; 412 413 if (e->type->ops.former_request) 414 return e->type->ops.former_request(q, rq); 415 416 return NULL; 417 } 418 419 #define to_elv(atr) container_of_const((atr), struct elv_fs_entry, attr) 420 421 static ssize_t 422 elv_attr_show(struct kobject *kobj, struct attribute *attr, char *page) 423 { 424 const struct elv_fs_entry *entry = to_elv(attr); 425 struct elevator_queue *e; 426 ssize_t error = -ENODEV; 427 428 if (!entry->show) 429 return -EIO; 430 431 e = container_of(kobj, struct elevator_queue, kobj); 432 mutex_lock(&e->sysfs_lock); 433 if (!test_bit(ELEVATOR_FLAG_DYING, &e->flags)) 434 error = entry->show(e, page); 435 mutex_unlock(&e->sysfs_lock); 436 return error; 437 } 438 439 static ssize_t 440 elv_attr_store(struct kobject *kobj, struct attribute *attr, 441 const char *page, size_t length) 442 { 443 const struct elv_fs_entry *entry = to_elv(attr); 444 struct elevator_queue *e; 445 ssize_t error = -ENODEV; 446 447 if (!entry->store) 448 return -EIO; 449 450 e = container_of(kobj, struct elevator_queue, kobj); 451 mutex_lock(&e->sysfs_lock); 452 if (!test_bit(ELEVATOR_FLAG_DYING, &e->flags)) 453 error = entry->store(e, page, length); 454 mutex_unlock(&e->sysfs_lock); 455 return error; 456 } 457 458 static const struct sysfs_ops elv_sysfs_ops = { 459 .show = elv_attr_show, 460 .store = elv_attr_store, 461 }; 462 463 static const struct kobj_type elv_ktype = { 464 .sysfs_ops = &elv_sysfs_ops, 465 .release = elevator_release, 466 }; 467 468 static int elv_register_queue(struct request_queue *q, 469 struct elevator_queue *e, 470 bool uevent) 471 { 472 int error; 473 474 error = kobject_add(&e->kobj, &q->disk->queue_kobj, "iosched"); 475 if (!error) { 476 const struct elv_fs_entry *attr = e->type->elevator_attrs; 477 if (attr) { 478 while (attr->attr.name) { 479 if (sysfs_create_file(&e->kobj, &attr->attr)) 480 break; 481 attr++; 482 } 483 } 484 if (uevent) 485 kobject_uevent(&e->kobj, KOBJ_ADD); 486 487 /* 488 * Sched is initialized, it is ready to export it via 489 * debugfs 490 */ 491 blk_mq_sched_reg_debugfs(q); 492 set_bit(ELEVATOR_FLAG_REGISTERED, &e->flags); 493 } 494 return error; 495 } 496 497 static void elv_unregister_queue(struct request_queue *q, 498 struct elevator_queue *e) 499 { 500 if (e && test_and_clear_bit(ELEVATOR_FLAG_REGISTERED, &e->flags)) { 501 kobject_uevent(&e->kobj, KOBJ_REMOVE); 502 kobject_del(&e->kobj); 503 504 /* unexport via debugfs before exiting sched */ 505 blk_mq_sched_unreg_debugfs(q); 506 } 507 } 508 509 int elv_register(struct elevator_type *e) 510 { 511 /* finish request is mandatory */ 512 if (WARN_ON_ONCE(!e->ops.finish_request)) 513 return -EINVAL; 514 /* insert_requests and dispatch_request are mandatory */ 515 if (WARN_ON_ONCE(!e->ops.insert_requests || !e->ops.dispatch_request)) 516 return -EINVAL; 517 518 /* create icq_cache if requested */ 519 if (e->icq_size) { 520 if (WARN_ON(e->icq_size < sizeof(struct io_cq)) || 521 WARN_ON(e->icq_align < __alignof__(struct io_cq))) 522 return -EINVAL; 523 524 snprintf(e->icq_cache_name, sizeof(e->icq_cache_name), 525 "%s_io_cq", e->elevator_name); 526 e->icq_cache = kmem_cache_create(e->icq_cache_name, e->icq_size, 527 e->icq_align, 0, NULL); 528 if (!e->icq_cache) 529 return -ENOMEM; 530 } 531 532 /* register, don't allow duplicate names */ 533 spin_lock(&elv_list_lock); 534 if (__elevator_find(e->elevator_name)) { 535 spin_unlock(&elv_list_lock); 536 kmem_cache_destroy(e->icq_cache); 537 return -EBUSY; 538 } 539 list_add_tail(&e->list, &elv_list); 540 spin_unlock(&elv_list_lock); 541 542 printk(KERN_INFO "io scheduler %s registered\n", e->elevator_name); 543 544 return 0; 545 } 546 EXPORT_SYMBOL_GPL(elv_register); 547 548 void elv_unregister(struct elevator_type *e) 549 { 550 /* unregister */ 551 spin_lock(&elv_list_lock); 552 list_del_init(&e->list); 553 spin_unlock(&elv_list_lock); 554 555 /* 556 * Destroy icq_cache if it exists. icq's are RCU managed. Make 557 * sure all RCU operations are complete before proceeding. 558 */ 559 if (e->icq_cache) { 560 rcu_barrier(); 561 kmem_cache_destroy(e->icq_cache); 562 e->icq_cache = NULL; 563 } 564 } 565 EXPORT_SYMBOL_GPL(elv_unregister); 566 567 /* 568 * Switch to new_e io scheduler. 569 * 570 * If switching fails, we are most likely running out of memory and not able 571 * to restore the old io scheduler, so leaving the io scheduler being none. 572 */ 573 static int elevator_switch(struct request_queue *q, struct elv_change_ctx *ctx) 574 { 575 struct elevator_type *new_e = NULL; 576 int ret = 0; 577 578 WARN_ON_ONCE(q->mq_freeze_depth == 0); 579 lockdep_assert_held(&q->elevator_lock); 580 581 if (strncmp(ctx->name, "none", 4)) { 582 new_e = elevator_find_get(ctx->name); 583 if (!new_e) 584 return -EINVAL; 585 } 586 587 blk_mq_quiesce_queue(q); 588 589 if (q->elevator) { 590 ctx->old = q->elevator; 591 elevator_exit(q); 592 } 593 594 if (new_e) { 595 ret = blk_mq_init_sched(q, new_e); 596 if (ret) 597 goto out_unfreeze; 598 ctx->new = q->elevator; 599 } else { 600 blk_queue_flag_clear(QUEUE_FLAG_SQ_SCHED, q); 601 q->elevator = NULL; 602 q->nr_requests = q->tag_set->queue_depth; 603 } 604 blk_add_trace_msg(q, "elv switch: %s", ctx->name); 605 606 out_unfreeze: 607 blk_mq_unquiesce_queue(q); 608 609 if (ret) { 610 pr_warn("elv: switch to \"%s\" failed, falling back to \"none\"\n", 611 new_e->elevator_name); 612 } 613 614 if (new_e) 615 elevator_put(new_e); 616 return ret; 617 } 618 619 static void elv_exit_and_release(struct request_queue *q) 620 { 621 struct elevator_queue *e; 622 unsigned memflags; 623 624 memflags = blk_mq_freeze_queue(q); 625 mutex_lock(&q->elevator_lock); 626 e = q->elevator; 627 elevator_exit(q); 628 mutex_unlock(&q->elevator_lock); 629 blk_mq_unfreeze_queue(q, memflags); 630 if (e) 631 kobject_put(&e->kobj); 632 } 633 634 static int elevator_change_done(struct request_queue *q, 635 struct elv_change_ctx *ctx) 636 { 637 int ret = 0; 638 639 if (ctx->old) { 640 bool enable_wbt = test_bit(ELEVATOR_FLAG_ENABLE_WBT_ON_EXIT, 641 &ctx->old->flags); 642 643 elv_unregister_queue(q, ctx->old); 644 kobject_put(&ctx->old->kobj); 645 if (enable_wbt) 646 wbt_enable_default(q->disk); 647 } 648 if (ctx->new) { 649 ret = elv_register_queue(q, ctx->new, !ctx->no_uevent); 650 if (ret) 651 elv_exit_and_release(q); 652 } 653 return ret; 654 } 655 656 /* 657 * Switch this queue to the given IO scheduler. 658 */ 659 static int elevator_change(struct request_queue *q, struct elv_change_ctx *ctx) 660 { 661 unsigned int memflags; 662 int ret = 0; 663 664 lockdep_assert_held(&q->tag_set->update_nr_hwq_lock); 665 666 memflags = blk_mq_freeze_queue(q); 667 /* 668 * May be called before adding disk, when there isn't any FS I/O, 669 * so freezing queue plus canceling dispatch work is enough to 670 * drain any dispatch activities originated from passthrough 671 * requests, then no need to quiesce queue which may add long boot 672 * latency, especially when lots of disks are involved. 673 * 674 * Disk isn't added yet, so verifying queue lock only manually. 675 */ 676 blk_mq_cancel_work_sync(q); 677 mutex_lock(&q->elevator_lock); 678 if (!(q->elevator && elevator_match(q->elevator->type, ctx->name))) 679 ret = elevator_switch(q, ctx); 680 mutex_unlock(&q->elevator_lock); 681 blk_mq_unfreeze_queue(q, memflags); 682 if (!ret) 683 ret = elevator_change_done(q, ctx); 684 685 return ret; 686 } 687 688 /* 689 * The I/O scheduler depends on the number of hardware queues, this forces a 690 * reattachment when nr_hw_queues changes. 691 */ 692 void elv_update_nr_hw_queues(struct request_queue *q, struct elevator_type *e) 693 { 694 struct elv_change_ctx ctx = {}; 695 int ret = -ENODEV; 696 697 WARN_ON_ONCE(q->mq_freeze_depth == 0); 698 699 if (e && !blk_queue_dying(q) && blk_queue_registered(q)) { 700 ctx.name = e->elevator_name; 701 702 mutex_lock(&q->elevator_lock); 703 /* force to reattach elevator after nr_hw_queue is updated */ 704 ret = elevator_switch(q, &ctx); 705 mutex_unlock(&q->elevator_lock); 706 } 707 blk_mq_unfreeze_queue_nomemrestore(q); 708 if (!ret) 709 WARN_ON_ONCE(elevator_change_done(q, &ctx)); 710 } 711 712 /* 713 * Use the default elevator settings. If the chosen elevator initialization 714 * fails, fall back to the "none" elevator (no elevator). 715 */ 716 void elevator_set_default(struct request_queue *q) 717 { 718 struct elv_change_ctx ctx = { 719 .name = "mq-deadline", 720 .no_uevent = true, 721 }; 722 int err; 723 struct elevator_type *e; 724 725 /* now we allow to switch elevator */ 726 blk_queue_flag_clear(QUEUE_FLAG_NO_ELV_SWITCH, q); 727 728 if (q->tag_set->flags & BLK_MQ_F_NO_SCHED_BY_DEFAULT) 729 return; 730 731 /* 732 * For single queue devices, default to using mq-deadline. If we 733 * have multiple queues or mq-deadline is not available, default 734 * to "none". 735 */ 736 e = elevator_find_get(ctx.name); 737 if (!e) 738 return; 739 740 if ((q->nr_hw_queues == 1 || 741 blk_mq_is_shared_tags(q->tag_set->flags))) { 742 err = elevator_change(q, &ctx); 743 if (err < 0) 744 pr_warn("\"%s\" elevator initialization, failed %d, falling back to \"none\"\n", 745 ctx.name, err); 746 } 747 elevator_put(e); 748 } 749 750 void elevator_set_none(struct request_queue *q) 751 { 752 struct elv_change_ctx ctx = { 753 .name = "none", 754 }; 755 int err; 756 757 err = elevator_change(q, &ctx); 758 if (err < 0) 759 pr_warn("%s: set none elevator failed %d\n", __func__, err); 760 } 761 762 static void elv_iosched_load_module(const char *elevator_name) 763 { 764 struct elevator_type *found; 765 766 spin_lock(&elv_list_lock); 767 found = __elevator_find(elevator_name); 768 spin_unlock(&elv_list_lock); 769 770 if (!found) 771 request_module("%s-iosched", elevator_name); 772 } 773 774 ssize_t elv_iosched_store(struct gendisk *disk, const char *buf, 775 size_t count) 776 { 777 char elevator_name[ELV_NAME_MAX]; 778 struct elv_change_ctx ctx = {}; 779 int ret; 780 struct request_queue *q = disk->queue; 781 struct blk_mq_tag_set *set = q->tag_set; 782 783 /* Make sure queue is not in the middle of being removed */ 784 if (!blk_queue_registered(q)) 785 return -ENOENT; 786 787 /* 788 * If the attribute needs to load a module, do it before freezing the 789 * queue to ensure that the module file can be read when the request 790 * queue is the one for the device storing the module file. 791 */ 792 strscpy(elevator_name, buf, sizeof(elevator_name)); 793 ctx.name = strstrip(elevator_name); 794 795 elv_iosched_load_module(ctx.name); 796 797 down_read(&set->update_nr_hwq_lock); 798 if (!blk_queue_no_elv_switch(q)) { 799 ret = elevator_change(q, &ctx); 800 if (!ret) 801 ret = count; 802 } else { 803 ret = -ENOENT; 804 } 805 up_read(&set->update_nr_hwq_lock); 806 return ret; 807 } 808 809 ssize_t elv_iosched_show(struct gendisk *disk, char *name) 810 { 811 struct request_queue *q = disk->queue; 812 struct elevator_type *cur = NULL, *e; 813 int len = 0; 814 815 mutex_lock(&q->elevator_lock); 816 if (!q->elevator) { 817 len += sprintf(name+len, "[none] "); 818 } else { 819 len += sprintf(name+len, "none "); 820 cur = q->elevator->type; 821 } 822 823 spin_lock(&elv_list_lock); 824 list_for_each_entry(e, &elv_list, list) { 825 if (e == cur) 826 len += sprintf(name+len, "[%s] ", e->elevator_name); 827 else 828 len += sprintf(name+len, "%s ", e->elevator_name); 829 } 830 spin_unlock(&elv_list_lock); 831 832 len += sprintf(name+len, "\n"); 833 mutex_unlock(&q->elevator_lock); 834 835 return len; 836 } 837 838 struct request *elv_rb_former_request(struct request_queue *q, 839 struct request *rq) 840 { 841 struct rb_node *rbprev = rb_prev(&rq->rb_node); 842 843 if (rbprev) 844 return rb_entry_rq(rbprev); 845 846 return NULL; 847 } 848 EXPORT_SYMBOL(elv_rb_former_request); 849 850 struct request *elv_rb_latter_request(struct request_queue *q, 851 struct request *rq) 852 { 853 struct rb_node *rbnext = rb_next(&rq->rb_node); 854 855 if (rbnext) 856 return rb_entry_rq(rbnext); 857 858 return NULL; 859 } 860 EXPORT_SYMBOL(elv_rb_latter_request); 861 862 static int __init elevator_setup(char *str) 863 { 864 pr_warn("Kernel parameter elevator= does not have any effect anymore.\n" 865 "Please use sysfs to set IO scheduler for individual devices.\n"); 866 return 1; 867 } 868 869 __setup("elevator=", elevator_setup); 870