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