1 /* 2 * Block device elevator/IO-scheduler. 3 * 4 * Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE 5 * 6 * 30042000 Jens Axboe <axboe@kernel.dk> : 7 * 8 * Split the elevator a bit so that it is possible to choose a different 9 * one or even write a new "plug in". There are three pieces: 10 * - elevator_fn, inserts a new request in the queue list 11 * - elevator_merge_fn, decides whether a new buffer can be merged with 12 * an existing request 13 * - elevator_dequeue_fn, called when a request is taken off the active list 14 * 15 * 20082000 Dave Jones <davej@suse.de> : 16 * Removed tests for max-bomb-segments, which was breaking elvtune 17 * when run without -bN 18 * 19 * Jens: 20 * - Rework again to work with bio instead of buffer_heads 21 * - loose bi_dev comparisons, partition handling is right now 22 * - completely modularize elevator setup and teardown 23 * 24 */ 25 #include <linux/kernel.h> 26 #include <linux/fs.h> 27 #include <linux/blkdev.h> 28 #include <linux/elevator.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 38 #include <trace/events/block.h> 39 40 #include "blk.h" 41 42 static DEFINE_SPINLOCK(elv_list_lock); 43 static LIST_HEAD(elv_list); 44 45 /* 46 * Merge hash stuff. 47 */ 48 static const int elv_hash_shift = 6; 49 #define ELV_HASH_BLOCK(sec) ((sec) >> 3) 50 #define ELV_HASH_FN(sec) \ 51 (hash_long(ELV_HASH_BLOCK((sec)), elv_hash_shift)) 52 #define ELV_HASH_ENTRIES (1 << elv_hash_shift) 53 #define rq_hash_key(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq)) 54 55 /* 56 * Query io scheduler to see if the current process issuing bio may be 57 * merged with rq. 58 */ 59 static int elv_iosched_allow_merge(struct request *rq, struct bio *bio) 60 { 61 struct request_queue *q = rq->q; 62 struct elevator_queue *e = q->elevator; 63 64 if (e->ops->elevator_allow_merge_fn) 65 return e->ops->elevator_allow_merge_fn(q, rq, bio); 66 67 return 1; 68 } 69 70 /* 71 * can we safely merge with this request? 72 */ 73 int elv_rq_merge_ok(struct request *rq, struct bio *bio) 74 { 75 if (!rq_mergeable(rq)) 76 return 0; 77 78 /* 79 * Don't merge file system requests and discard requests 80 */ 81 if ((bio->bi_rw & REQ_DISCARD) != (rq->bio->bi_rw & REQ_DISCARD)) 82 return 0; 83 84 /* 85 * Don't merge discard requests and secure discard requests 86 */ 87 if ((bio->bi_rw & REQ_SECURE) != (rq->bio->bi_rw & REQ_SECURE)) 88 return 0; 89 90 /* 91 * different data direction or already started, don't merge 92 */ 93 if (bio_data_dir(bio) != rq_data_dir(rq)) 94 return 0; 95 96 /* 97 * must be same device and not a special request 98 */ 99 if (rq->rq_disk != bio->bi_bdev->bd_disk || rq->special) 100 return 0; 101 102 /* 103 * only merge integrity protected bio into ditto rq 104 */ 105 if (bio_integrity(bio) != blk_integrity_rq(rq)) 106 return 0; 107 108 if (!elv_iosched_allow_merge(rq, bio)) 109 return 0; 110 111 return 1; 112 } 113 EXPORT_SYMBOL(elv_rq_merge_ok); 114 115 int elv_try_merge(struct request *__rq, struct bio *bio) 116 { 117 int ret = ELEVATOR_NO_MERGE; 118 119 /* 120 * we can merge and sequence is ok, check if it's possible 121 */ 122 if (elv_rq_merge_ok(__rq, bio)) { 123 if (blk_rq_pos(__rq) + blk_rq_sectors(__rq) == bio->bi_sector) 124 ret = ELEVATOR_BACK_MERGE; 125 else if (blk_rq_pos(__rq) - bio_sectors(bio) == bio->bi_sector) 126 ret = ELEVATOR_FRONT_MERGE; 127 } 128 129 return ret; 130 } 131 132 static struct elevator_type *elevator_find(const char *name) 133 { 134 struct elevator_type *e; 135 136 list_for_each_entry(e, &elv_list, list) { 137 if (!strcmp(e->elevator_name, name)) 138 return e; 139 } 140 141 return NULL; 142 } 143 144 static void elevator_put(struct elevator_type *e) 145 { 146 module_put(e->elevator_owner); 147 } 148 149 static struct elevator_type *elevator_get(const char *name) 150 { 151 struct elevator_type *e; 152 153 spin_lock(&elv_list_lock); 154 155 e = elevator_find(name); 156 if (!e) { 157 spin_unlock(&elv_list_lock); 158 request_module("%s-iosched", name); 159 spin_lock(&elv_list_lock); 160 e = elevator_find(name); 161 } 162 163 if (e && !try_module_get(e->elevator_owner)) 164 e = NULL; 165 166 spin_unlock(&elv_list_lock); 167 168 return e; 169 } 170 171 static void *elevator_init_queue(struct request_queue *q, 172 struct elevator_queue *eq) 173 { 174 return eq->ops->elevator_init_fn(q); 175 } 176 177 static void elevator_attach(struct request_queue *q, struct elevator_queue *eq, 178 void *data) 179 { 180 q->elevator = eq; 181 eq->elevator_data = data; 182 } 183 184 static char chosen_elevator[ELV_NAME_MAX]; 185 186 static int __init elevator_setup(char *str) 187 { 188 /* 189 * Be backwards-compatible with previous kernels, so users 190 * won't get the wrong elevator. 191 */ 192 strncpy(chosen_elevator, str, sizeof(chosen_elevator) - 1); 193 return 1; 194 } 195 196 __setup("elevator=", elevator_setup); 197 198 static struct kobj_type elv_ktype; 199 200 static struct elevator_queue *elevator_alloc(struct request_queue *q, 201 struct elevator_type *e) 202 { 203 struct elevator_queue *eq; 204 int i; 205 206 eq = kmalloc_node(sizeof(*eq), GFP_KERNEL | __GFP_ZERO, q->node); 207 if (unlikely(!eq)) 208 goto err; 209 210 eq->ops = &e->ops; 211 eq->elevator_type = e; 212 kobject_init(&eq->kobj, &elv_ktype); 213 mutex_init(&eq->sysfs_lock); 214 215 eq->hash = kmalloc_node(sizeof(struct hlist_head) * ELV_HASH_ENTRIES, 216 GFP_KERNEL, q->node); 217 if (!eq->hash) 218 goto err; 219 220 for (i = 0; i < ELV_HASH_ENTRIES; i++) 221 INIT_HLIST_HEAD(&eq->hash[i]); 222 223 return eq; 224 err: 225 kfree(eq); 226 elevator_put(e); 227 return NULL; 228 } 229 230 static void elevator_release(struct kobject *kobj) 231 { 232 struct elevator_queue *e; 233 234 e = container_of(kobj, struct elevator_queue, kobj); 235 elevator_put(e->elevator_type); 236 kfree(e->hash); 237 kfree(e); 238 } 239 240 int elevator_init(struct request_queue *q, char *name) 241 { 242 struct elevator_type *e = NULL; 243 struct elevator_queue *eq; 244 void *data; 245 246 if (unlikely(q->elevator)) 247 return 0; 248 249 INIT_LIST_HEAD(&q->queue_head); 250 q->last_merge = NULL; 251 q->end_sector = 0; 252 q->boundary_rq = NULL; 253 254 if (name) { 255 e = elevator_get(name); 256 if (!e) 257 return -EINVAL; 258 } 259 260 if (!e && *chosen_elevator) { 261 e = elevator_get(chosen_elevator); 262 if (!e) 263 printk(KERN_ERR "I/O scheduler %s not found\n", 264 chosen_elevator); 265 } 266 267 if (!e) { 268 e = elevator_get(CONFIG_DEFAULT_IOSCHED); 269 if (!e) { 270 printk(KERN_ERR 271 "Default I/O scheduler not found. " \ 272 "Using noop.\n"); 273 e = elevator_get("noop"); 274 } 275 } 276 277 eq = elevator_alloc(q, e); 278 if (!eq) 279 return -ENOMEM; 280 281 data = elevator_init_queue(q, eq); 282 if (!data) { 283 kobject_put(&eq->kobj); 284 return -ENOMEM; 285 } 286 287 elevator_attach(q, eq, data); 288 return 0; 289 } 290 EXPORT_SYMBOL(elevator_init); 291 292 void elevator_exit(struct elevator_queue *e) 293 { 294 mutex_lock(&e->sysfs_lock); 295 if (e->ops->elevator_exit_fn) 296 e->ops->elevator_exit_fn(e); 297 e->ops = NULL; 298 mutex_unlock(&e->sysfs_lock); 299 300 kobject_put(&e->kobj); 301 } 302 EXPORT_SYMBOL(elevator_exit); 303 304 static inline void __elv_rqhash_del(struct request *rq) 305 { 306 hlist_del_init(&rq->hash); 307 } 308 309 static void elv_rqhash_del(struct request_queue *q, struct request *rq) 310 { 311 if (ELV_ON_HASH(rq)) 312 __elv_rqhash_del(rq); 313 } 314 315 static void elv_rqhash_add(struct request_queue *q, struct request *rq) 316 { 317 struct elevator_queue *e = q->elevator; 318 319 BUG_ON(ELV_ON_HASH(rq)); 320 hlist_add_head(&rq->hash, &e->hash[ELV_HASH_FN(rq_hash_key(rq))]); 321 } 322 323 static void elv_rqhash_reposition(struct request_queue *q, struct request *rq) 324 { 325 __elv_rqhash_del(rq); 326 elv_rqhash_add(q, rq); 327 } 328 329 static struct request *elv_rqhash_find(struct request_queue *q, sector_t offset) 330 { 331 struct elevator_queue *e = q->elevator; 332 struct hlist_head *hash_list = &e->hash[ELV_HASH_FN(offset)]; 333 struct hlist_node *entry, *next; 334 struct request *rq; 335 336 hlist_for_each_entry_safe(rq, entry, next, hash_list, hash) { 337 BUG_ON(!ELV_ON_HASH(rq)); 338 339 if (unlikely(!rq_mergeable(rq))) { 340 __elv_rqhash_del(rq); 341 continue; 342 } 343 344 if (rq_hash_key(rq) == offset) 345 return rq; 346 } 347 348 return NULL; 349 } 350 351 /* 352 * RB-tree support functions for inserting/lookup/removal of requests 353 * in a sorted RB tree. 354 */ 355 void elv_rb_add(struct rb_root *root, struct request *rq) 356 { 357 struct rb_node **p = &root->rb_node; 358 struct rb_node *parent = NULL; 359 struct request *__rq; 360 361 while (*p) { 362 parent = *p; 363 __rq = rb_entry(parent, struct request, rb_node); 364 365 if (blk_rq_pos(rq) < blk_rq_pos(__rq)) 366 p = &(*p)->rb_left; 367 else if (blk_rq_pos(rq) >= blk_rq_pos(__rq)) 368 p = &(*p)->rb_right; 369 } 370 371 rb_link_node(&rq->rb_node, parent, p); 372 rb_insert_color(&rq->rb_node, root); 373 } 374 EXPORT_SYMBOL(elv_rb_add); 375 376 void elv_rb_del(struct rb_root *root, struct request *rq) 377 { 378 BUG_ON(RB_EMPTY_NODE(&rq->rb_node)); 379 rb_erase(&rq->rb_node, root); 380 RB_CLEAR_NODE(&rq->rb_node); 381 } 382 EXPORT_SYMBOL(elv_rb_del); 383 384 struct request *elv_rb_find(struct rb_root *root, sector_t sector) 385 { 386 struct rb_node *n = root->rb_node; 387 struct request *rq; 388 389 while (n) { 390 rq = rb_entry(n, struct request, rb_node); 391 392 if (sector < blk_rq_pos(rq)) 393 n = n->rb_left; 394 else if (sector > blk_rq_pos(rq)) 395 n = n->rb_right; 396 else 397 return rq; 398 } 399 400 return NULL; 401 } 402 EXPORT_SYMBOL(elv_rb_find); 403 404 /* 405 * Insert rq into dispatch queue of q. Queue lock must be held on 406 * entry. rq is sort instead into the dispatch queue. To be used by 407 * specific elevators. 408 */ 409 void elv_dispatch_sort(struct request_queue *q, struct request *rq) 410 { 411 sector_t boundary; 412 struct list_head *entry; 413 int stop_flags; 414 415 if (q->last_merge == rq) 416 q->last_merge = NULL; 417 418 elv_rqhash_del(q, rq); 419 420 q->nr_sorted--; 421 422 boundary = q->end_sector; 423 stop_flags = REQ_SOFTBARRIER | REQ_STARTED; 424 list_for_each_prev(entry, &q->queue_head) { 425 struct request *pos = list_entry_rq(entry); 426 427 if ((rq->cmd_flags & REQ_DISCARD) != 428 (pos->cmd_flags & REQ_DISCARD)) 429 break; 430 if (rq_data_dir(rq) != rq_data_dir(pos)) 431 break; 432 if (pos->cmd_flags & stop_flags) 433 break; 434 if (blk_rq_pos(rq) >= boundary) { 435 if (blk_rq_pos(pos) < boundary) 436 continue; 437 } else { 438 if (blk_rq_pos(pos) >= boundary) 439 break; 440 } 441 if (blk_rq_pos(rq) >= blk_rq_pos(pos)) 442 break; 443 } 444 445 list_add(&rq->queuelist, entry); 446 } 447 EXPORT_SYMBOL(elv_dispatch_sort); 448 449 /* 450 * Insert rq into dispatch queue of q. Queue lock must be held on 451 * entry. rq is added to the back of the dispatch queue. To be used by 452 * specific elevators. 453 */ 454 void elv_dispatch_add_tail(struct request_queue *q, struct request *rq) 455 { 456 if (q->last_merge == rq) 457 q->last_merge = NULL; 458 459 elv_rqhash_del(q, rq); 460 461 q->nr_sorted--; 462 463 q->end_sector = rq_end_sector(rq); 464 q->boundary_rq = rq; 465 list_add_tail(&rq->queuelist, &q->queue_head); 466 } 467 EXPORT_SYMBOL(elv_dispatch_add_tail); 468 469 int elv_merge(struct request_queue *q, struct request **req, struct bio *bio) 470 { 471 struct elevator_queue *e = q->elevator; 472 struct request *__rq; 473 int ret; 474 475 /* 476 * Levels of merges: 477 * nomerges: No merges at all attempted 478 * noxmerges: Only simple one-hit cache try 479 * merges: All merge tries attempted 480 */ 481 if (blk_queue_nomerges(q)) 482 return ELEVATOR_NO_MERGE; 483 484 /* 485 * First try one-hit cache. 486 */ 487 if (q->last_merge) { 488 ret = elv_try_merge(q->last_merge, bio); 489 if (ret != ELEVATOR_NO_MERGE) { 490 *req = q->last_merge; 491 return ret; 492 } 493 } 494 495 if (blk_queue_noxmerges(q)) 496 return ELEVATOR_NO_MERGE; 497 498 /* 499 * See if our hash lookup can find a potential backmerge. 500 */ 501 __rq = elv_rqhash_find(q, bio->bi_sector); 502 if (__rq && elv_rq_merge_ok(__rq, bio)) { 503 *req = __rq; 504 return ELEVATOR_BACK_MERGE; 505 } 506 507 if (e->ops->elevator_merge_fn) 508 return e->ops->elevator_merge_fn(q, req, bio); 509 510 return ELEVATOR_NO_MERGE; 511 } 512 513 /* 514 * Attempt to do an insertion back merge. Only check for the case where 515 * we can append 'rq' to an existing request, so we can throw 'rq' away 516 * afterwards. 517 * 518 * Returns true if we merged, false otherwise 519 */ 520 static bool elv_attempt_insert_merge(struct request_queue *q, 521 struct request *rq) 522 { 523 struct request *__rq; 524 525 if (blk_queue_nomerges(q)) 526 return false; 527 528 /* 529 * First try one-hit cache. 530 */ 531 if (q->last_merge && blk_attempt_req_merge(q, q->last_merge, rq)) 532 return true; 533 534 if (blk_queue_noxmerges(q)) 535 return false; 536 537 /* 538 * See if our hash lookup can find a potential backmerge. 539 */ 540 __rq = elv_rqhash_find(q, blk_rq_pos(rq)); 541 if (__rq && blk_attempt_req_merge(q, __rq, rq)) 542 return true; 543 544 return false; 545 } 546 547 void elv_merged_request(struct request_queue *q, struct request *rq, int type) 548 { 549 struct elevator_queue *e = q->elevator; 550 551 if (e->ops->elevator_merged_fn) 552 e->ops->elevator_merged_fn(q, rq, type); 553 554 if (type == ELEVATOR_BACK_MERGE) 555 elv_rqhash_reposition(q, rq); 556 557 q->last_merge = rq; 558 } 559 560 void elv_merge_requests(struct request_queue *q, struct request *rq, 561 struct request *next) 562 { 563 struct elevator_queue *e = q->elevator; 564 const int next_sorted = next->cmd_flags & REQ_SORTED; 565 566 if (next_sorted && e->ops->elevator_merge_req_fn) 567 e->ops->elevator_merge_req_fn(q, rq, next); 568 569 elv_rqhash_reposition(q, rq); 570 571 if (next_sorted) { 572 elv_rqhash_del(q, next); 573 q->nr_sorted--; 574 } 575 576 q->last_merge = rq; 577 } 578 579 void elv_bio_merged(struct request_queue *q, struct request *rq, 580 struct bio *bio) 581 { 582 struct elevator_queue *e = q->elevator; 583 584 if (e->ops->elevator_bio_merged_fn) 585 e->ops->elevator_bio_merged_fn(q, rq, bio); 586 } 587 588 void elv_requeue_request(struct request_queue *q, struct request *rq) 589 { 590 /* 591 * it already went through dequeue, we need to decrement the 592 * in_flight count again 593 */ 594 if (blk_account_rq(rq)) { 595 q->in_flight[rq_is_sync(rq)]--; 596 if (rq->cmd_flags & REQ_SORTED) 597 elv_deactivate_rq(q, rq); 598 } 599 600 rq->cmd_flags &= ~REQ_STARTED; 601 602 __elv_add_request(q, rq, ELEVATOR_INSERT_REQUEUE); 603 } 604 605 void elv_drain_elevator(struct request_queue *q) 606 { 607 static int printed; 608 609 lockdep_assert_held(q->queue_lock); 610 611 while (q->elevator->ops->elevator_dispatch_fn(q, 1)) 612 ; 613 if (q->nr_sorted && printed++ < 10) { 614 printk(KERN_ERR "%s: forced dispatching is broken " 615 "(nr_sorted=%u), please report this\n", 616 q->elevator->elevator_type->elevator_name, q->nr_sorted); 617 } 618 } 619 620 void elv_quiesce_start(struct request_queue *q) 621 { 622 if (!q->elevator) 623 return; 624 625 spin_lock_irq(q->queue_lock); 626 queue_flag_set(QUEUE_FLAG_ELVSWITCH, q); 627 spin_unlock_irq(q->queue_lock); 628 629 blk_drain_queue(q, false); 630 } 631 632 void elv_quiesce_end(struct request_queue *q) 633 { 634 spin_lock_irq(q->queue_lock); 635 queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q); 636 spin_unlock_irq(q->queue_lock); 637 } 638 639 void __elv_add_request(struct request_queue *q, struct request *rq, int where) 640 { 641 trace_block_rq_insert(q, rq); 642 643 rq->q = q; 644 645 if (rq->cmd_flags & REQ_SOFTBARRIER) { 646 /* barriers are scheduling boundary, update end_sector */ 647 if (rq->cmd_type == REQ_TYPE_FS || 648 (rq->cmd_flags & REQ_DISCARD)) { 649 q->end_sector = rq_end_sector(rq); 650 q->boundary_rq = rq; 651 } 652 } else if (!(rq->cmd_flags & REQ_ELVPRIV) && 653 (where == ELEVATOR_INSERT_SORT || 654 where == ELEVATOR_INSERT_SORT_MERGE)) 655 where = ELEVATOR_INSERT_BACK; 656 657 switch (where) { 658 case ELEVATOR_INSERT_REQUEUE: 659 case ELEVATOR_INSERT_FRONT: 660 rq->cmd_flags |= REQ_SOFTBARRIER; 661 list_add(&rq->queuelist, &q->queue_head); 662 break; 663 664 case ELEVATOR_INSERT_BACK: 665 rq->cmd_flags |= REQ_SOFTBARRIER; 666 elv_drain_elevator(q); 667 list_add_tail(&rq->queuelist, &q->queue_head); 668 /* 669 * We kick the queue here for the following reasons. 670 * - The elevator might have returned NULL previously 671 * to delay requests and returned them now. As the 672 * queue wasn't empty before this request, ll_rw_blk 673 * won't run the queue on return, resulting in hang. 674 * - Usually, back inserted requests won't be merged 675 * with anything. There's no point in delaying queue 676 * processing. 677 */ 678 __blk_run_queue(q); 679 break; 680 681 case ELEVATOR_INSERT_SORT_MERGE: 682 /* 683 * If we succeed in merging this request with one in the 684 * queue already, we are done - rq has now been freed, 685 * so no need to do anything further. 686 */ 687 if (elv_attempt_insert_merge(q, rq)) 688 break; 689 case ELEVATOR_INSERT_SORT: 690 BUG_ON(rq->cmd_type != REQ_TYPE_FS && 691 !(rq->cmd_flags & REQ_DISCARD)); 692 rq->cmd_flags |= REQ_SORTED; 693 q->nr_sorted++; 694 if (rq_mergeable(rq)) { 695 elv_rqhash_add(q, rq); 696 if (!q->last_merge) 697 q->last_merge = rq; 698 } 699 700 /* 701 * Some ioscheds (cfq) run q->request_fn directly, so 702 * rq cannot be accessed after calling 703 * elevator_add_req_fn. 704 */ 705 q->elevator->ops->elevator_add_req_fn(q, rq); 706 break; 707 708 case ELEVATOR_INSERT_FLUSH: 709 rq->cmd_flags |= REQ_SOFTBARRIER; 710 blk_insert_flush(rq); 711 break; 712 default: 713 printk(KERN_ERR "%s: bad insertion point %d\n", 714 __func__, where); 715 BUG(); 716 } 717 } 718 EXPORT_SYMBOL(__elv_add_request); 719 720 void elv_add_request(struct request_queue *q, struct request *rq, int where) 721 { 722 unsigned long flags; 723 724 spin_lock_irqsave(q->queue_lock, flags); 725 __elv_add_request(q, rq, where); 726 spin_unlock_irqrestore(q->queue_lock, flags); 727 } 728 EXPORT_SYMBOL(elv_add_request); 729 730 struct request *elv_latter_request(struct request_queue *q, struct request *rq) 731 { 732 struct elevator_queue *e = q->elevator; 733 734 if (e->ops->elevator_latter_req_fn) 735 return e->ops->elevator_latter_req_fn(q, rq); 736 return NULL; 737 } 738 739 struct request *elv_former_request(struct request_queue *q, struct request *rq) 740 { 741 struct elevator_queue *e = q->elevator; 742 743 if (e->ops->elevator_former_req_fn) 744 return e->ops->elevator_former_req_fn(q, rq); 745 return NULL; 746 } 747 748 int elv_set_request(struct request_queue *q, struct request *rq, gfp_t gfp_mask) 749 { 750 struct elevator_queue *e = q->elevator; 751 752 if (e->ops->elevator_set_req_fn) 753 return e->ops->elevator_set_req_fn(q, rq, gfp_mask); 754 755 rq->elevator_private[0] = NULL; 756 return 0; 757 } 758 759 void elv_put_request(struct request_queue *q, struct request *rq) 760 { 761 struct elevator_queue *e = q->elevator; 762 763 if (e->ops->elevator_put_req_fn) 764 e->ops->elevator_put_req_fn(rq); 765 } 766 767 int elv_may_queue(struct request_queue *q, int rw) 768 { 769 struct elevator_queue *e = q->elevator; 770 771 if (e->ops->elevator_may_queue_fn) 772 return e->ops->elevator_may_queue_fn(q, rw); 773 774 return ELV_MQUEUE_MAY; 775 } 776 777 void elv_abort_queue(struct request_queue *q) 778 { 779 struct request *rq; 780 781 blk_abort_flushes(q); 782 783 while (!list_empty(&q->queue_head)) { 784 rq = list_entry_rq(q->queue_head.next); 785 rq->cmd_flags |= REQ_QUIET; 786 trace_block_rq_abort(q, rq); 787 /* 788 * Mark this request as started so we don't trigger 789 * any debug logic in the end I/O path. 790 */ 791 blk_start_request(rq); 792 __blk_end_request_all(rq, -EIO); 793 } 794 } 795 EXPORT_SYMBOL(elv_abort_queue); 796 797 void elv_completed_request(struct request_queue *q, struct request *rq) 798 { 799 struct elevator_queue *e = q->elevator; 800 801 /* 802 * request is released from the driver, io must be done 803 */ 804 if (blk_account_rq(rq)) { 805 q->in_flight[rq_is_sync(rq)]--; 806 if ((rq->cmd_flags & REQ_SORTED) && 807 e->ops->elevator_completed_req_fn) 808 e->ops->elevator_completed_req_fn(q, rq); 809 } 810 } 811 812 #define to_elv(atr) container_of((atr), struct elv_fs_entry, attr) 813 814 static ssize_t 815 elv_attr_show(struct kobject *kobj, struct attribute *attr, char *page) 816 { 817 struct elv_fs_entry *entry = to_elv(attr); 818 struct elevator_queue *e; 819 ssize_t error; 820 821 if (!entry->show) 822 return -EIO; 823 824 e = container_of(kobj, struct elevator_queue, kobj); 825 mutex_lock(&e->sysfs_lock); 826 error = e->ops ? entry->show(e, page) : -ENOENT; 827 mutex_unlock(&e->sysfs_lock); 828 return error; 829 } 830 831 static ssize_t 832 elv_attr_store(struct kobject *kobj, struct attribute *attr, 833 const char *page, size_t length) 834 { 835 struct elv_fs_entry *entry = to_elv(attr); 836 struct elevator_queue *e; 837 ssize_t error; 838 839 if (!entry->store) 840 return -EIO; 841 842 e = container_of(kobj, struct elevator_queue, kobj); 843 mutex_lock(&e->sysfs_lock); 844 error = e->ops ? entry->store(e, page, length) : -ENOENT; 845 mutex_unlock(&e->sysfs_lock); 846 return error; 847 } 848 849 static const struct sysfs_ops elv_sysfs_ops = { 850 .show = elv_attr_show, 851 .store = elv_attr_store, 852 }; 853 854 static struct kobj_type elv_ktype = { 855 .sysfs_ops = &elv_sysfs_ops, 856 .release = elevator_release, 857 }; 858 859 int elv_register_queue(struct request_queue *q) 860 { 861 struct elevator_queue *e = q->elevator; 862 int error; 863 864 error = kobject_add(&e->kobj, &q->kobj, "%s", "iosched"); 865 if (!error) { 866 struct elv_fs_entry *attr = e->elevator_type->elevator_attrs; 867 if (attr) { 868 while (attr->attr.name) { 869 if (sysfs_create_file(&e->kobj, &attr->attr)) 870 break; 871 attr++; 872 } 873 } 874 kobject_uevent(&e->kobj, KOBJ_ADD); 875 e->registered = 1; 876 } 877 return error; 878 } 879 EXPORT_SYMBOL(elv_register_queue); 880 881 static void __elv_unregister_queue(struct elevator_queue *e) 882 { 883 kobject_uevent(&e->kobj, KOBJ_REMOVE); 884 kobject_del(&e->kobj); 885 e->registered = 0; 886 } 887 888 void elv_unregister_queue(struct request_queue *q) 889 { 890 if (q) 891 __elv_unregister_queue(q->elevator); 892 } 893 EXPORT_SYMBOL(elv_unregister_queue); 894 895 void elv_register(struct elevator_type *e) 896 { 897 char *def = ""; 898 899 spin_lock(&elv_list_lock); 900 BUG_ON(elevator_find(e->elevator_name)); 901 list_add_tail(&e->list, &elv_list); 902 spin_unlock(&elv_list_lock); 903 904 if (!strcmp(e->elevator_name, chosen_elevator) || 905 (!*chosen_elevator && 906 !strcmp(e->elevator_name, CONFIG_DEFAULT_IOSCHED))) 907 def = " (default)"; 908 909 printk(KERN_INFO "io scheduler %s registered%s\n", e->elevator_name, 910 def); 911 } 912 EXPORT_SYMBOL_GPL(elv_register); 913 914 void elv_unregister(struct elevator_type *e) 915 { 916 struct task_struct *g, *p; 917 918 /* 919 * Iterate every thread in the process to remove the io contexts. 920 */ 921 if (e->ops.trim) { 922 read_lock(&tasklist_lock); 923 do_each_thread(g, p) { 924 task_lock(p); 925 if (p->io_context) 926 e->ops.trim(p->io_context); 927 task_unlock(p); 928 } while_each_thread(g, p); 929 read_unlock(&tasklist_lock); 930 } 931 932 spin_lock(&elv_list_lock); 933 list_del_init(&e->list); 934 spin_unlock(&elv_list_lock); 935 } 936 EXPORT_SYMBOL_GPL(elv_unregister); 937 938 /* 939 * switch to new_e io scheduler. be careful not to introduce deadlocks - 940 * we don't free the old io scheduler, before we have allocated what we 941 * need for the new one. this way we have a chance of going back to the old 942 * one, if the new one fails init for some reason. 943 */ 944 static int elevator_switch(struct request_queue *q, struct elevator_type *new_e) 945 { 946 struct elevator_queue *old_elevator, *e; 947 void *data; 948 int err; 949 950 /* 951 * Allocate new elevator 952 */ 953 e = elevator_alloc(q, new_e); 954 if (!e) 955 return -ENOMEM; 956 957 data = elevator_init_queue(q, e); 958 if (!data) { 959 kobject_put(&e->kobj); 960 return -ENOMEM; 961 } 962 963 /* 964 * Turn on BYPASS and drain all requests w/ elevator private data 965 */ 966 elv_quiesce_start(q); 967 968 /* 969 * Remember old elevator. 970 */ 971 old_elevator = q->elevator; 972 973 /* 974 * attach and start new elevator 975 */ 976 spin_lock_irq(q->queue_lock); 977 elevator_attach(q, e, data); 978 spin_unlock_irq(q->queue_lock); 979 980 if (old_elevator->registered) { 981 __elv_unregister_queue(old_elevator); 982 983 err = elv_register_queue(q); 984 if (err) 985 goto fail_register; 986 } 987 988 /* 989 * finally exit old elevator and turn off BYPASS. 990 */ 991 elevator_exit(old_elevator); 992 elv_quiesce_end(q); 993 994 blk_add_trace_msg(q, "elv switch: %s", e->elevator_type->elevator_name); 995 996 return 0; 997 998 fail_register: 999 /* 1000 * switch failed, exit the new io scheduler and reattach the old 1001 * one again (along with re-adding the sysfs dir) 1002 */ 1003 elevator_exit(e); 1004 q->elevator = old_elevator; 1005 elv_register_queue(q); 1006 elv_quiesce_end(q); 1007 1008 return err; 1009 } 1010 1011 /* 1012 * Switch this queue to the given IO scheduler. 1013 */ 1014 int elevator_change(struct request_queue *q, const char *name) 1015 { 1016 char elevator_name[ELV_NAME_MAX]; 1017 struct elevator_type *e; 1018 1019 if (!q->elevator) 1020 return -ENXIO; 1021 1022 strlcpy(elevator_name, name, sizeof(elevator_name)); 1023 e = elevator_get(strstrip(elevator_name)); 1024 if (!e) { 1025 printk(KERN_ERR "elevator: type %s not found\n", elevator_name); 1026 return -EINVAL; 1027 } 1028 1029 if (!strcmp(elevator_name, q->elevator->elevator_type->elevator_name)) { 1030 elevator_put(e); 1031 return 0; 1032 } 1033 1034 return elevator_switch(q, e); 1035 } 1036 EXPORT_SYMBOL(elevator_change); 1037 1038 ssize_t elv_iosched_store(struct request_queue *q, const char *name, 1039 size_t count) 1040 { 1041 int ret; 1042 1043 if (!q->elevator) 1044 return count; 1045 1046 ret = elevator_change(q, name); 1047 if (!ret) 1048 return count; 1049 1050 printk(KERN_ERR "elevator: switch to %s failed\n", name); 1051 return ret; 1052 } 1053 1054 ssize_t elv_iosched_show(struct request_queue *q, char *name) 1055 { 1056 struct elevator_queue *e = q->elevator; 1057 struct elevator_type *elv; 1058 struct elevator_type *__e; 1059 int len = 0; 1060 1061 if (!q->elevator || !blk_queue_stackable(q)) 1062 return sprintf(name, "none\n"); 1063 1064 elv = e->elevator_type; 1065 1066 spin_lock(&elv_list_lock); 1067 list_for_each_entry(__e, &elv_list, list) { 1068 if (!strcmp(elv->elevator_name, __e->elevator_name)) 1069 len += sprintf(name+len, "[%s] ", elv->elevator_name); 1070 else 1071 len += sprintf(name+len, "%s ", __e->elevator_name); 1072 } 1073 spin_unlock(&elv_list_lock); 1074 1075 len += sprintf(len+name, "\n"); 1076 return len; 1077 } 1078 1079 struct request *elv_rb_former_request(struct request_queue *q, 1080 struct request *rq) 1081 { 1082 struct rb_node *rbprev = rb_prev(&rq->rb_node); 1083 1084 if (rbprev) 1085 return rb_entry_rq(rbprev); 1086 1087 return NULL; 1088 } 1089 EXPORT_SYMBOL(elv_rb_former_request); 1090 1091 struct request *elv_rb_latter_request(struct request_queue *q, 1092 struct request *rq) 1093 { 1094 struct rb_node *rbnext = rb_next(&rq->rb_node); 1095 1096 if (rbnext) 1097 return rb_entry_rq(rbnext); 1098 1099 return NULL; 1100 } 1101 EXPORT_SYMBOL(elv_rb_latter_request); 1102