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