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