Blame view
block/deadline-iosched.c
11.1 KB
1da177e4c Linux-2.6.12-rc2 |
1 |
/* |
1da177e4c Linux-2.6.12-rc2 |
2 3 |
* Deadline i/o scheduler. * |
0fe234795 [PATCH] Update ax... |
4 |
* Copyright (C) 2002 Jens Axboe <axboe@kernel.dk> |
1da177e4c Linux-2.6.12-rc2 |
5 6 7 8 9 10 |
*/ #include <linux/kernel.h> #include <linux/fs.h> #include <linux/blkdev.h> #include <linux/elevator.h> #include <linux/bio.h> |
1da177e4c Linux-2.6.12-rc2 |
11 12 13 14 |
#include <linux/module.h> #include <linux/slab.h> #include <linux/init.h> #include <linux/compiler.h> |
1da177e4c Linux-2.6.12-rc2 |
15 16 17 18 19 |
#include <linux/rbtree.h> /* * See Documentation/block/deadline-iosched.txt */ |
64100099e [BLOCK] mark some... |
20 21 22 23 |
static const int read_expire = HZ / 2; /* max time before a read is submitted. */ static const int write_expire = 5 * HZ; /* ditto for writes, these limits are SOFT! */ static const int writes_starved = 2; /* max times reads can starve a write */ static const int fifo_batch = 16; /* # of sequential requests treated as one |
1da177e4c Linux-2.6.12-rc2 |
24 |
by the above parameters. For throughput. */ |
1da177e4c Linux-2.6.12-rc2 |
25 26 27 28 29 30 31 32 33 34 |
struct deadline_data { /* * run time data */ /* * requests (deadline_rq s) are present on both sort_list and fifo_list */ struct rb_root sort_list[2]; struct list_head fifo_list[2]; |
4fb72f764 deadline-iosched:... |
35 |
|
1da177e4c Linux-2.6.12-rc2 |
36 37 38 |
/* * next in sort order. read, write or both are NULL */ |
8840faa1e [PATCH] deadline-... |
39 |
struct request *next_rq[2]; |
1da177e4c Linux-2.6.12-rc2 |
40 41 42 43 44 45 46 47 48 49 50 |
unsigned int batching; /* number of sequential requests made */ sector_t last_sector; /* head position */ unsigned int starved; /* times reads have starved writes */ /* * settings that change how the i/o scheduler behaves */ int fifo_expire[2]; int fifo_batch; int writes_starved; int front_merges; |
1da177e4c Linux-2.6.12-rc2 |
51 |
}; |
8840faa1e [PATCH] deadline-... |
52 |
static void deadline_move_request(struct deadline_data *, struct request *); |
1da177e4c Linux-2.6.12-rc2 |
53 |
|
4fb72f764 deadline-iosched:... |
54 55 56 57 58 |
static inline struct rb_root * deadline_rb_root(struct deadline_data *dd, struct request *rq) { return &dd->sort_list[rq_data_dir(rq)]; } |
1da177e4c Linux-2.6.12-rc2 |
59 |
|
5d1a53662 Deadline iosched:... |
60 61 62 63 64 65 66 67 68 69 70 71 72 |
/* * get the request after `rq' in sector-sorted order */ static inline struct request * deadline_latter_request(struct request *rq) { struct rb_node *node = rb_next(&rq->rb_node); if (node) return rb_entry_rq(node); return NULL; } |
1da177e4c Linux-2.6.12-rc2 |
73 |
static void |
8840faa1e [PATCH] deadline-... |
74 |
deadline_add_rq_rb(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
75 |
{ |
4fb72f764 deadline-iosched:... |
76 |
struct rb_root *root = deadline_rb_root(dd, rq); |
1da177e4c Linux-2.6.12-rc2 |
77 |
|
796d5116c iosched: prevent ... |
78 |
elv_rb_add(root, rq); |
1da177e4c Linux-2.6.12-rc2 |
79 80 81 |
} static inline void |
8840faa1e [PATCH] deadline-... |
82 |
deadline_del_rq_rb(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
83 |
{ |
b8aca35af [PATCH] deadline-... |
84 |
const int data_dir = rq_data_dir(rq); |
1da177e4c Linux-2.6.12-rc2 |
85 |
|
5d1a53662 Deadline iosched:... |
86 87 |
if (dd->next_rq[data_dir] == rq) dd->next_rq[data_dir] = deadline_latter_request(rq); |
1da177e4c Linux-2.6.12-rc2 |
88 |
|
4fb72f764 deadline-iosched:... |
89 |
elv_rb_del(deadline_rb_root(dd, rq), rq); |
1da177e4c Linux-2.6.12-rc2 |
90 91 92 |
} /* |
8840faa1e [PATCH] deadline-... |
93 |
* add rq to rbtree and fifo |
1da177e4c Linux-2.6.12-rc2 |
94 |
*/ |
b4878f245 [PATCH] 02/05: up... |
95 |
static void |
1da177e4c Linux-2.6.12-rc2 |
96 97 98 |
deadline_add_request(struct request_queue *q, struct request *rq) { struct deadline_data *dd = q->elevator->elevator_data; |
8840faa1e [PATCH] deadline-... |
99 |
const int data_dir = rq_data_dir(rq); |
1da177e4c Linux-2.6.12-rc2 |
100 |
|
8840faa1e [PATCH] deadline-... |
101 |
deadline_add_rq_rb(dd, rq); |
9817064b6 [PATCH] elevator:... |
102 |
|
1da177e4c Linux-2.6.12-rc2 |
103 |
/* |
4fb72f764 deadline-iosched:... |
104 |
* set expire time and add to fifo list |
1da177e4c Linux-2.6.12-rc2 |
105 |
*/ |
8840faa1e [PATCH] deadline-... |
106 107 |
rq_set_fifo_time(rq, jiffies + dd->fifo_expire[data_dir]); list_add_tail(&rq->queuelist, &dd->fifo_list[data_dir]); |
1da177e4c Linux-2.6.12-rc2 |
108 109 110 |
} /* |
9817064b6 [PATCH] elevator:... |
111 |
* remove rq from rbtree and fifo. |
1da177e4c Linux-2.6.12-rc2 |
112 |
*/ |
165125e1e [BLOCK] Get rid o... |
113 |
static void deadline_remove_request(struct request_queue *q, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
114 |
{ |
b4878f245 [PATCH] 02/05: up... |
115 |
struct deadline_data *dd = q->elevator->elevator_data; |
1da177e4c Linux-2.6.12-rc2 |
116 |
|
8840faa1e [PATCH] deadline-... |
117 118 |
rq_fifo_clear(rq); deadline_del_rq_rb(dd, rq); |
1da177e4c Linux-2.6.12-rc2 |
119 120 121 |
} static int |
165125e1e [BLOCK] Get rid o... |
122 |
deadline_merge(struct request_queue *q, struct request **req, struct bio *bio) |
1da177e4c Linux-2.6.12-rc2 |
123 124 125 126 127 128 |
{ struct deadline_data *dd = q->elevator->elevator_data; struct request *__rq; int ret; /* |
1da177e4c Linux-2.6.12-rc2 |
129 130 131 |
* check for front merge */ if (dd->front_merges) { |
b8aca35af [PATCH] deadline-... |
132 |
sector_t sector = bio->bi_sector + bio_sectors(bio); |
1da177e4c Linux-2.6.12-rc2 |
133 |
|
b8aca35af [PATCH] deadline-... |
134 |
__rq = elv_rb_find(&dd->sort_list[bio_data_dir(bio)], sector); |
1da177e4c Linux-2.6.12-rc2 |
135 |
if (__rq) { |
83096ebf1 block: convert to... |
136 |
BUG_ON(sector != blk_rq_pos(__rq)); |
1da177e4c Linux-2.6.12-rc2 |
137 138 139 140 141 142 143 144 145 146 |
if (elv_rq_merge_ok(__rq, bio)) { ret = ELEVATOR_FRONT_MERGE; goto out; } } } return ELEVATOR_NO_MERGE; out: |
1da177e4c Linux-2.6.12-rc2 |
147 148 149 |
*req = __rq; return ret; } |
165125e1e [BLOCK] Get rid o... |
150 151 |
static void deadline_merged_request(struct request_queue *q, struct request *req, int type) |
1da177e4c Linux-2.6.12-rc2 |
152 153 |
{ struct deadline_data *dd = q->elevator->elevator_data; |
1da177e4c Linux-2.6.12-rc2 |
154 155 |
/* |
1da177e4c Linux-2.6.12-rc2 |
156 157 |
* if the merge was a front merge, we need to reposition request */ |
b8aca35af [PATCH] deadline-... |
158 |
if (type == ELEVATOR_FRONT_MERGE) { |
4fb72f764 deadline-iosched:... |
159 |
elv_rb_del(deadline_rb_root(dd, req), req); |
8840faa1e [PATCH] deadline-... |
160 |
deadline_add_rq_rb(dd, req); |
1da177e4c Linux-2.6.12-rc2 |
161 |
} |
1da177e4c Linux-2.6.12-rc2 |
162 163 164 |
} static void |
165125e1e [BLOCK] Get rid o... |
165 |
deadline_merged_requests(struct request_queue *q, struct request *req, |
1da177e4c Linux-2.6.12-rc2 |
166 167 |
struct request *next) { |
1da177e4c Linux-2.6.12-rc2 |
168 |
/* |
8840faa1e [PATCH] deadline-... |
169 170 |
* if next expires before rq, assign its expire time to rq * and move into next position (next will be deleted) in fifo |
1da177e4c Linux-2.6.12-rc2 |
171 |
*/ |
8840faa1e [PATCH] deadline-... |
172 173 174 175 |
if (!list_empty(&req->queuelist) && !list_empty(&next->queuelist)) { if (time_before(rq_fifo_time(next), rq_fifo_time(req))) { list_move(&req->queuelist, &next->queuelist); rq_set_fifo_time(req, rq_fifo_time(next)); |
1da177e4c Linux-2.6.12-rc2 |
176 177 178 179 180 181 182 183 184 185 186 187 188 |
} } /* * kill knowledge of next, this one is a goner */ deadline_remove_request(q, next); } /* * move request from sort list to dispatch queue. */ static inline void |
8840faa1e [PATCH] deadline-... |
189 |
deadline_move_to_dispatch(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
190 |
{ |
165125e1e [BLOCK] Get rid o... |
191 |
struct request_queue *q = rq->q; |
1da177e4c Linux-2.6.12-rc2 |
192 |
|
8840faa1e [PATCH] deadline-... |
193 194 |
deadline_remove_request(q, rq); elv_dispatch_add_tail(q, rq); |
1da177e4c Linux-2.6.12-rc2 |
195 196 197 198 199 200 |
} /* * move an entry to dispatch queue */ static void |
8840faa1e [PATCH] deadline-... |
201 |
deadline_move_request(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
202 |
{ |
b8aca35af [PATCH] deadline-... |
203 |
const int data_dir = rq_data_dir(rq); |
1da177e4c Linux-2.6.12-rc2 |
204 |
|
8840faa1e [PATCH] deadline-... |
205 206 |
dd->next_rq[READ] = NULL; dd->next_rq[WRITE] = NULL; |
5d1a53662 Deadline iosched:... |
207 |
dd->next_rq[data_dir] = deadline_latter_request(rq); |
1da177e4c Linux-2.6.12-rc2 |
208 |
|
4fb72f764 deadline-iosched:... |
209 |
dd->last_sector = rq_end_sector(rq); |
1da177e4c Linux-2.6.12-rc2 |
210 211 212 213 214 |
/* * take it off the sort and fifo list, move * to dispatch queue */ |
8840faa1e [PATCH] deadline-... |
215 |
deadline_move_to_dispatch(dd, rq); |
1da177e4c Linux-2.6.12-rc2 |
216 |
} |
1da177e4c Linux-2.6.12-rc2 |
217 |
/* |
4fb72f764 deadline-iosched:... |
218 |
* deadline_check_fifo returns 0 if there are no expired requests on the fifo, |
1da177e4c Linux-2.6.12-rc2 |
219 220 221 222 |
* 1 otherwise. Requires !list_empty(&dd->fifo_list[data_dir]) */ static inline int deadline_check_fifo(struct deadline_data *dd, int ddir) { |
8840faa1e [PATCH] deadline-... |
223 |
struct request *rq = rq_entry_fifo(dd->fifo_list[ddir].next); |
1da177e4c Linux-2.6.12-rc2 |
224 225 |
/* |
8840faa1e [PATCH] deadline-... |
226 |
* rq is expired! |
1da177e4c Linux-2.6.12-rc2 |
227 |
*/ |
8840faa1e [PATCH] deadline-... |
228 |
if (time_after(jiffies, rq_fifo_time(rq))) |
1da177e4c Linux-2.6.12-rc2 |
229 230 231 232 233 234 235 236 237 |
return 1; return 0; } /* * deadline_dispatch_requests selects the best request according to * read/write expire, fifo_batch, etc */ |
165125e1e [BLOCK] Get rid o... |
238 |
static int deadline_dispatch_requests(struct request_queue *q, int force) |
1da177e4c Linux-2.6.12-rc2 |
239 |
{ |
b4878f245 [PATCH] 02/05: up... |
240 |
struct deadline_data *dd = q->elevator->elevator_data; |
1da177e4c Linux-2.6.12-rc2 |
241 242 |
const int reads = !list_empty(&dd->fifo_list[READ]); const int writes = !list_empty(&dd->fifo_list[WRITE]); |
8840faa1e [PATCH] deadline-... |
243 |
struct request *rq; |
4b0dc07e6 [PATCH] cleanup o... |
244 |
int data_dir; |
1da177e4c Linux-2.6.12-rc2 |
245 246 247 248 |
/* * batches are currently reads XOR writes */ |
8840faa1e [PATCH] deadline-... |
249 250 |
if (dd->next_rq[WRITE]) rq = dd->next_rq[WRITE]; |
9d5c1e1bf [PATCH] deadline:... |
251 |
else |
8840faa1e [PATCH] deadline-... |
252 |
rq = dd->next_rq[READ]; |
1da177e4c Linux-2.6.12-rc2 |
253 |
|
63de428b1 deadline-iosched:... |
254 255 256 |
if (rq && dd->batching < dd->fifo_batch) /* we have a next request are still entitled to batch */ goto dispatch_request; |
1da177e4c Linux-2.6.12-rc2 |
257 258 259 260 261 262 263 |
/* * at this point we are not running a batch. select the appropriate * data direction (read / write) */ if (reads) { |
dd67d0515 [PATCH] rbtree: s... |
264 |
BUG_ON(RB_EMPTY_ROOT(&dd->sort_list[READ])); |
1da177e4c Linux-2.6.12-rc2 |
265 266 267 268 269 |
if (writes && (dd->starved++ >= dd->writes_starved)) goto dispatch_writes; data_dir = READ; |
1da177e4c Linux-2.6.12-rc2 |
270 271 272 273 274 275 276 277 278 279 |
goto dispatch_find_request; } /* * there are either no reads or writes have been starved */ if (writes) { dispatch_writes: |
dd67d0515 [PATCH] rbtree: s... |
280 |
BUG_ON(RB_EMPTY_ROOT(&dd->sort_list[WRITE])); |
1da177e4c Linux-2.6.12-rc2 |
281 282 283 284 |
dd->starved = 0; data_dir = WRITE; |
1da177e4c Linux-2.6.12-rc2 |
285 286 287 288 289 290 291 292 293 294 |
goto dispatch_find_request; } return 0; dispatch_find_request: /* * we are not running a batch, find best request for selected data_dir */ |
6f5d8aa63 Deadline iosched:... |
295 296 297 298 299 300 |
if (deadline_check_fifo(dd, data_dir) || !dd->next_rq[data_dir]) { /* * A deadline has expired, the last request was in the other * direction, or we have run out of higher-sectored requests. * Start again from the request with the earliest expiry time. */ |
8840faa1e [PATCH] deadline-... |
301 |
rq = rq_entry_fifo(dd->fifo_list[data_dir].next); |
6f5d8aa63 Deadline iosched:... |
302 |
} else { |
1da177e4c Linux-2.6.12-rc2 |
303 304 305 306 |
/* * The last req was the same dir and we have a next request in * sort order. No expired requests so continue on from here. */ |
8840faa1e [PATCH] deadline-... |
307 |
rq = dd->next_rq[data_dir]; |
1da177e4c Linux-2.6.12-rc2 |
308 |
} |
dfb3d72a9 Deadline iosched:... |
309 |
dd->batching = 0; |
1da177e4c Linux-2.6.12-rc2 |
310 311 |
dispatch_request: /* |
8840faa1e [PATCH] deadline-... |
312 |
* rq is the selected appropriate request. |
1da177e4c Linux-2.6.12-rc2 |
313 314 |
*/ dd->batching++; |
8840faa1e [PATCH] deadline-... |
315 |
deadline_move_request(dd, rq); |
1da177e4c Linux-2.6.12-rc2 |
316 317 318 |
return 1; } |
b374d18a4 block: get rid of... |
319 |
static void deadline_exit_queue(struct elevator_queue *e) |
1da177e4c Linux-2.6.12-rc2 |
320 321 322 323 324 |
{ struct deadline_data *dd = e->elevator_data; BUG_ON(!list_empty(&dd->fifo_list[READ])); BUG_ON(!list_empty(&dd->fifo_list[WRITE])); |
1da177e4c Linux-2.6.12-rc2 |
325 326 327 328 |
kfree(dd); } /* |
8840faa1e [PATCH] deadline-... |
329 |
* initialize elevator private data (deadline_data). |
1da177e4c Linux-2.6.12-rc2 |
330 |
*/ |
165125e1e [BLOCK] Get rid o... |
331 |
static void *deadline_init_queue(struct request_queue *q) |
1da177e4c Linux-2.6.12-rc2 |
332 333 |
{ struct deadline_data *dd; |
1da177e4c Linux-2.6.12-rc2 |
334 |
|
94f6030ca Slab allocators: ... |
335 |
dd = kmalloc_node(sizeof(*dd), GFP_KERNEL | __GFP_ZERO, q->node); |
1da177e4c Linux-2.6.12-rc2 |
336 |
if (!dd) |
bc1c11697 [PATCH] elevator ... |
337 |
return NULL; |
1da177e4c Linux-2.6.12-rc2 |
338 |
|
1da177e4c Linux-2.6.12-rc2 |
339 340 341 342 |
INIT_LIST_HEAD(&dd->fifo_list[READ]); INIT_LIST_HEAD(&dd->fifo_list[WRITE]); dd->sort_list[READ] = RB_ROOT; dd->sort_list[WRITE] = RB_ROOT; |
1da177e4c Linux-2.6.12-rc2 |
343 344 345 346 347 |
dd->fifo_expire[READ] = read_expire; dd->fifo_expire[WRITE] = write_expire; dd->writes_starved = writes_starved; dd->front_merges = 1; dd->fifo_batch = fifo_batch; |
bc1c11697 [PATCH] elevator ... |
348 |
return dd; |
1da177e4c Linux-2.6.12-rc2 |
349 |
} |
1da177e4c Linux-2.6.12-rc2 |
350 351 352 |
/* * sysfs parts below */ |
1da177e4c Linux-2.6.12-rc2 |
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 |
static ssize_t deadline_var_show(int var, char *page) { return sprintf(page, "%d ", var); } static ssize_t deadline_var_store(int *var, const char *page, size_t count) { char *p = (char *) page; *var = simple_strtol(p, &p, 10); return count; } #define SHOW_FUNCTION(__FUNC, __VAR, __CONV) \ |
b374d18a4 block: get rid of... |
371 |
static ssize_t __FUNC(struct elevator_queue *e, char *page) \ |
1da177e4c Linux-2.6.12-rc2 |
372 |
{ \ |
3d1ab40f4 [PATCH] elevator_... |
373 374 |
struct deadline_data *dd = e->elevator_data; \ int __data = __VAR; \ |
1da177e4c Linux-2.6.12-rc2 |
375 376 377 378 |
if (__CONV) \ __data = jiffies_to_msecs(__data); \ return deadline_var_show(__data, (page)); \ } |
e572ec7e4 [PATCH] fix rmmod... |
379 380 381 382 383 |
SHOW_FUNCTION(deadline_read_expire_show, dd->fifo_expire[READ], 1); SHOW_FUNCTION(deadline_write_expire_show, dd->fifo_expire[WRITE], 1); SHOW_FUNCTION(deadline_writes_starved_show, dd->writes_starved, 0); SHOW_FUNCTION(deadline_front_merges_show, dd->front_merges, 0); SHOW_FUNCTION(deadline_fifo_batch_show, dd->fifo_batch, 0); |
1da177e4c Linux-2.6.12-rc2 |
384 385 386 |
#undef SHOW_FUNCTION #define STORE_FUNCTION(__FUNC, __PTR, MIN, MAX, __CONV) \ |
b374d18a4 block: get rid of... |
387 |
static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count) \ |
1da177e4c Linux-2.6.12-rc2 |
388 |
{ \ |
3d1ab40f4 [PATCH] elevator_... |
389 |
struct deadline_data *dd = e->elevator_data; \ |
1da177e4c Linux-2.6.12-rc2 |
390 391 392 393 394 395 396 397 398 399 400 401 |
int __data; \ int ret = deadline_var_store(&__data, (page), count); \ if (__data < (MIN)) \ __data = (MIN); \ else if (__data > (MAX)) \ __data = (MAX); \ if (__CONV) \ *(__PTR) = msecs_to_jiffies(__data); \ else \ *(__PTR) = __data; \ return ret; \ } |
e572ec7e4 [PATCH] fix rmmod... |
402 403 404 405 406 |
STORE_FUNCTION(deadline_read_expire_store, &dd->fifo_expire[READ], 0, INT_MAX, 1); STORE_FUNCTION(deadline_write_expire_store, &dd->fifo_expire[WRITE], 0, INT_MAX, 1); STORE_FUNCTION(deadline_writes_starved_store, &dd->writes_starved, INT_MIN, INT_MAX, 0); STORE_FUNCTION(deadline_front_merges_store, &dd->front_merges, 0, 1, 0); STORE_FUNCTION(deadline_fifo_batch_store, &dd->fifo_batch, 0, INT_MAX, 0); |
1da177e4c Linux-2.6.12-rc2 |
407 |
#undef STORE_FUNCTION |
e572ec7e4 [PATCH] fix rmmod... |
408 409 410 411 412 413 414 415 416 417 418 |
#define DD_ATTR(name) \ __ATTR(name, S_IRUGO|S_IWUSR, deadline_##name##_show, \ deadline_##name##_store) static struct elv_fs_entry deadline_attrs[] = { DD_ATTR(read_expire), DD_ATTR(write_expire), DD_ATTR(writes_starved), DD_ATTR(front_merges), DD_ATTR(fifo_batch), __ATTR_NULL |
1da177e4c Linux-2.6.12-rc2 |
419 |
}; |
1da177e4c Linux-2.6.12-rc2 |
420 421 422 423 424 |
static struct elevator_type iosched_deadline = { .ops = { .elevator_merge_fn = deadline_merge, .elevator_merged_fn = deadline_merged_request, .elevator_merge_req_fn = deadline_merged_requests, |
b4878f245 [PATCH] 02/05: up... |
425 426 |
.elevator_dispatch_fn = deadline_dispatch_requests, .elevator_add_req_fn = deadline_add_request, |
b8aca35af [PATCH] deadline-... |
427 428 |
.elevator_former_req_fn = elv_rb_former_request, .elevator_latter_req_fn = elv_rb_latter_request, |
1da177e4c Linux-2.6.12-rc2 |
429 430 431 |
.elevator_init_fn = deadline_init_queue, .elevator_exit_fn = deadline_exit_queue, }, |
3d1ab40f4 [PATCH] elevator_... |
432 |
.elevator_attrs = deadline_attrs, |
1da177e4c Linux-2.6.12-rc2 |
433 434 435 436 437 438 |
.elevator_name = "deadline", .elevator_owner = THIS_MODULE, }; static int __init deadline_init(void) { |
2fdd82bd8 block: let elv_re... |
439 440 441 |
elv_register(&iosched_deadline); return 0; |
1da177e4c Linux-2.6.12-rc2 |
442 443 444 445 |
} static void __exit deadline_exit(void) { |
1da177e4c Linux-2.6.12-rc2 |
446 447 448 449 450 451 452 453 454 |
elv_unregister(&iosched_deadline); } module_init(deadline_init); module_exit(deadline_exit); MODULE_AUTHOR("Jens Axboe"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("deadline IO scheduler"); |