Blame view
block/deadline-iosched.c
11.4 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); |
b8aca35af [PATCH] deadline-... |
77 |
struct request *__alias; |
1da177e4c Linux-2.6.12-rc2 |
78 |
|
4fb72f764 deadline-iosched:... |
79 |
while (unlikely(__alias = elv_rb_add(root, rq))) |
8840faa1e [PATCH] deadline-... |
80 |
deadline_move_request(dd, __alias); |
1da177e4c Linux-2.6.12-rc2 |
81 82 83 |
} static inline void |
8840faa1e [PATCH] deadline-... |
84 |
deadline_del_rq_rb(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
85 |
{ |
b8aca35af [PATCH] deadline-... |
86 |
const int data_dir = rq_data_dir(rq); |
1da177e4c Linux-2.6.12-rc2 |
87 |
|
5d1a53662 Deadline iosched:... |
88 89 |
if (dd->next_rq[data_dir] == rq) dd->next_rq[data_dir] = deadline_latter_request(rq); |
1da177e4c Linux-2.6.12-rc2 |
90 |
|
4fb72f764 deadline-iosched:... |
91 |
elv_rb_del(deadline_rb_root(dd, rq), rq); |
1da177e4c Linux-2.6.12-rc2 |
92 93 94 |
} /* |
8840faa1e [PATCH] deadline-... |
95 |
* add rq to rbtree and fifo |
1da177e4c Linux-2.6.12-rc2 |
96 |
*/ |
b4878f245 [PATCH] 02/05: up... |
97 |
static void |
1da177e4c Linux-2.6.12-rc2 |
98 99 100 |
deadline_add_request(struct request_queue *q, struct request *rq) { struct deadline_data *dd = q->elevator->elevator_data; |
8840faa1e [PATCH] deadline-... |
101 |
const int data_dir = rq_data_dir(rq); |
1da177e4c Linux-2.6.12-rc2 |
102 |
|
8840faa1e [PATCH] deadline-... |
103 |
deadline_add_rq_rb(dd, rq); |
9817064b6 [PATCH] elevator:... |
104 |
|
1da177e4c Linux-2.6.12-rc2 |
105 |
/* |
4fb72f764 deadline-iosched:... |
106 |
* set expire time and add to fifo list |
1da177e4c Linux-2.6.12-rc2 |
107 |
*/ |
8840faa1e [PATCH] deadline-... |
108 109 |
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 |
110 111 112 |
} /* |
9817064b6 [PATCH] elevator:... |
113 |
* remove rq from rbtree and fifo. |
1da177e4c Linux-2.6.12-rc2 |
114 |
*/ |
165125e1e [BLOCK] Get rid o... |
115 |
static void deadline_remove_request(struct request_queue *q, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
116 |
{ |
b4878f245 [PATCH] 02/05: up... |
117 |
struct deadline_data *dd = q->elevator->elevator_data; |
1da177e4c Linux-2.6.12-rc2 |
118 |
|
8840faa1e [PATCH] deadline-... |
119 120 |
rq_fifo_clear(rq); deadline_del_rq_rb(dd, rq); |
1da177e4c Linux-2.6.12-rc2 |
121 122 123 |
} static int |
165125e1e [BLOCK] Get rid o... |
124 |
deadline_merge(struct request_queue *q, struct request **req, struct bio *bio) |
1da177e4c Linux-2.6.12-rc2 |
125 126 127 128 129 130 |
{ struct deadline_data *dd = q->elevator->elevator_data; struct request *__rq; int ret; /* |
1da177e4c Linux-2.6.12-rc2 |
131 132 133 |
* check for front merge */ if (dd->front_merges) { |
b8aca35af [PATCH] deadline-... |
134 |
sector_t sector = bio->bi_sector + bio_sectors(bio); |
1da177e4c Linux-2.6.12-rc2 |
135 |
|
b8aca35af [PATCH] deadline-... |
136 |
__rq = elv_rb_find(&dd->sort_list[bio_data_dir(bio)], sector); |
1da177e4c Linux-2.6.12-rc2 |
137 |
if (__rq) { |
83096ebf1 block: convert to... |
138 |
BUG_ON(sector != blk_rq_pos(__rq)); |
1da177e4c Linux-2.6.12-rc2 |
139 140 141 142 143 144 145 146 147 148 |
if (elv_rq_merge_ok(__rq, bio)) { ret = ELEVATOR_FRONT_MERGE; goto out; } } } return ELEVATOR_NO_MERGE; out: |
1da177e4c Linux-2.6.12-rc2 |
149 150 151 |
*req = __rq; return ret; } |
165125e1e [BLOCK] Get rid o... |
152 153 |
static void deadline_merged_request(struct request_queue *q, struct request *req, int type) |
1da177e4c Linux-2.6.12-rc2 |
154 155 |
{ struct deadline_data *dd = q->elevator->elevator_data; |
1da177e4c Linux-2.6.12-rc2 |
156 157 |
/* |
1da177e4c Linux-2.6.12-rc2 |
158 159 |
* if the merge was a front merge, we need to reposition request */ |
b8aca35af [PATCH] deadline-... |
160 |
if (type == ELEVATOR_FRONT_MERGE) { |
4fb72f764 deadline-iosched:... |
161 |
elv_rb_del(deadline_rb_root(dd, req), req); |
8840faa1e [PATCH] deadline-... |
162 |
deadline_add_rq_rb(dd, req); |
1da177e4c Linux-2.6.12-rc2 |
163 |
} |
1da177e4c Linux-2.6.12-rc2 |
164 165 166 |
} static void |
165125e1e [BLOCK] Get rid o... |
167 |
deadline_merged_requests(struct request_queue *q, struct request *req, |
1da177e4c Linux-2.6.12-rc2 |
168 169 |
struct request *next) { |
1da177e4c Linux-2.6.12-rc2 |
170 |
/* |
8840faa1e [PATCH] deadline-... |
171 172 |
* 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 |
173 |
*/ |
8840faa1e [PATCH] deadline-... |
174 175 176 177 |
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 |
178 179 180 181 182 183 184 185 186 187 188 189 190 |
} } /* * 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-... |
191 |
deadline_move_to_dispatch(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
192 |
{ |
165125e1e [BLOCK] Get rid o... |
193 |
struct request_queue *q = rq->q; |
1da177e4c Linux-2.6.12-rc2 |
194 |
|
8840faa1e [PATCH] deadline-... |
195 196 |
deadline_remove_request(q, rq); elv_dispatch_add_tail(q, rq); |
1da177e4c Linux-2.6.12-rc2 |
197 198 199 200 201 202 |
} /* * move an entry to dispatch queue */ static void |
8840faa1e [PATCH] deadline-... |
203 |
deadline_move_request(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
204 |
{ |
b8aca35af [PATCH] deadline-... |
205 |
const int data_dir = rq_data_dir(rq); |
1da177e4c Linux-2.6.12-rc2 |
206 |
|
8840faa1e [PATCH] deadline-... |
207 208 |
dd->next_rq[READ] = NULL; dd->next_rq[WRITE] = NULL; |
5d1a53662 Deadline iosched:... |
209 |
dd->next_rq[data_dir] = deadline_latter_request(rq); |
1da177e4c Linux-2.6.12-rc2 |
210 |
|
4fb72f764 deadline-iosched:... |
211 |
dd->last_sector = rq_end_sector(rq); |
1da177e4c Linux-2.6.12-rc2 |
212 213 214 215 216 |
/* * take it off the sort and fifo list, move * to dispatch queue */ |
8840faa1e [PATCH] deadline-... |
217 |
deadline_move_to_dispatch(dd, rq); |
1da177e4c Linux-2.6.12-rc2 |
218 |
} |
1da177e4c Linux-2.6.12-rc2 |
219 |
/* |
4fb72f764 deadline-iosched:... |
220 |
* deadline_check_fifo returns 0 if there are no expired requests on the fifo, |
1da177e4c Linux-2.6.12-rc2 |
221 222 223 224 |
* 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-... |
225 |
struct request *rq = rq_entry_fifo(dd->fifo_list[ddir].next); |
1da177e4c Linux-2.6.12-rc2 |
226 227 |
/* |
8840faa1e [PATCH] deadline-... |
228 |
* rq is expired! |
1da177e4c Linux-2.6.12-rc2 |
229 |
*/ |
8840faa1e [PATCH] deadline-... |
230 |
if (time_after(jiffies, rq_fifo_time(rq))) |
1da177e4c Linux-2.6.12-rc2 |
231 232 233 234 235 236 237 238 239 |
return 1; return 0; } /* * deadline_dispatch_requests selects the best request according to * read/write expire, fifo_batch, etc */ |
165125e1e [BLOCK] Get rid o... |
240 |
static int deadline_dispatch_requests(struct request_queue *q, int force) |
1da177e4c Linux-2.6.12-rc2 |
241 |
{ |
b4878f245 [PATCH] 02/05: up... |
242 |
struct deadline_data *dd = q->elevator->elevator_data; |
1da177e4c Linux-2.6.12-rc2 |
243 244 |
const int reads = !list_empty(&dd->fifo_list[READ]); const int writes = !list_empty(&dd->fifo_list[WRITE]); |
8840faa1e [PATCH] deadline-... |
245 |
struct request *rq; |
4b0dc07e6 [PATCH] cleanup o... |
246 |
int data_dir; |
1da177e4c Linux-2.6.12-rc2 |
247 248 249 250 |
/* * batches are currently reads XOR writes */ |
8840faa1e [PATCH] deadline-... |
251 252 |
if (dd->next_rq[WRITE]) rq = dd->next_rq[WRITE]; |
9d5c1e1bf [PATCH] deadline:... |
253 |
else |
8840faa1e [PATCH] deadline-... |
254 |
rq = dd->next_rq[READ]; |
1da177e4c Linux-2.6.12-rc2 |
255 |
|
63de428b1 deadline-iosched:... |
256 257 258 |
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 |
259 260 261 262 263 264 265 |
/* * at this point we are not running a batch. select the appropriate * data direction (read / write) */ if (reads) { |
dd67d0515 [PATCH] rbtree: s... |
266 |
BUG_ON(RB_EMPTY_ROOT(&dd->sort_list[READ])); |
1da177e4c Linux-2.6.12-rc2 |
267 268 269 270 271 |
if (writes && (dd->starved++ >= dd->writes_starved)) goto dispatch_writes; data_dir = READ; |
1da177e4c Linux-2.6.12-rc2 |
272 273 274 275 276 277 278 279 280 281 |
goto dispatch_find_request; } /* * there are either no reads or writes have been starved */ if (writes) { dispatch_writes: |
dd67d0515 [PATCH] rbtree: s... |
282 |
BUG_ON(RB_EMPTY_ROOT(&dd->sort_list[WRITE])); |
1da177e4c Linux-2.6.12-rc2 |
283 284 285 286 |
dd->starved = 0; data_dir = WRITE; |
1da177e4c Linux-2.6.12-rc2 |
287 288 289 290 291 292 293 294 295 296 |
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:... |
297 298 299 300 301 302 |
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-... |
303 |
rq = rq_entry_fifo(dd->fifo_list[data_dir].next); |
6f5d8aa63 Deadline iosched:... |
304 |
} else { |
1da177e4c Linux-2.6.12-rc2 |
305 306 307 308 |
/* * 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-... |
309 |
rq = dd->next_rq[data_dir]; |
1da177e4c Linux-2.6.12-rc2 |
310 |
} |
dfb3d72a9 Deadline iosched:... |
311 |
dd->batching = 0; |
1da177e4c Linux-2.6.12-rc2 |
312 313 |
dispatch_request: /* |
8840faa1e [PATCH] deadline-... |
314 |
* rq is the selected appropriate request. |
1da177e4c Linux-2.6.12-rc2 |
315 316 |
*/ dd->batching++; |
8840faa1e [PATCH] deadline-... |
317 |
deadline_move_request(dd, rq); |
1da177e4c Linux-2.6.12-rc2 |
318 319 320 |
return 1; } |
165125e1e [BLOCK] Get rid o... |
321 |
static int deadline_queue_empty(struct request_queue *q) |
1da177e4c Linux-2.6.12-rc2 |
322 323 |
{ struct deadline_data *dd = q->elevator->elevator_data; |
b4878f245 [PATCH] 02/05: up... |
324 325 |
return list_empty(&dd->fifo_list[WRITE]) && list_empty(&dd->fifo_list[READ]); |
1da177e4c Linux-2.6.12-rc2 |
326 |
} |
b374d18a4 block: get rid of... |
327 |
static void deadline_exit_queue(struct elevator_queue *e) |
1da177e4c Linux-2.6.12-rc2 |
328 329 330 331 332 |
{ 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 |
333 334 335 336 |
kfree(dd); } /* |
8840faa1e [PATCH] deadline-... |
337 |
* initialize elevator private data (deadline_data). |
1da177e4c Linux-2.6.12-rc2 |
338 |
*/ |
165125e1e [BLOCK] Get rid o... |
339 |
static void *deadline_init_queue(struct request_queue *q) |
1da177e4c Linux-2.6.12-rc2 |
340 341 |
{ struct deadline_data *dd; |
1da177e4c Linux-2.6.12-rc2 |
342 |
|
94f6030ca Slab allocators: ... |
343 |
dd = kmalloc_node(sizeof(*dd), GFP_KERNEL | __GFP_ZERO, q->node); |
1da177e4c Linux-2.6.12-rc2 |
344 |
if (!dd) |
bc1c11697 [PATCH] elevator ... |
345 |
return NULL; |
1da177e4c Linux-2.6.12-rc2 |
346 |
|
1da177e4c Linux-2.6.12-rc2 |
347 348 349 350 |
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 |
351 352 353 354 355 |
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 ... |
356 |
return dd; |
1da177e4c Linux-2.6.12-rc2 |
357 |
} |
1da177e4c Linux-2.6.12-rc2 |
358 359 360 |
/* * sysfs parts below */ |
1da177e4c Linux-2.6.12-rc2 |
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 |
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... |
379 |
static ssize_t __FUNC(struct elevator_queue *e, char *page) \ |
1da177e4c Linux-2.6.12-rc2 |
380 |
{ \ |
3d1ab40f4 [PATCH] elevator_... |
381 382 |
struct deadline_data *dd = e->elevator_data; \ int __data = __VAR; \ |
1da177e4c Linux-2.6.12-rc2 |
383 384 385 386 |
if (__CONV) \ __data = jiffies_to_msecs(__data); \ return deadline_var_show(__data, (page)); \ } |
e572ec7e4 [PATCH] fix rmmod... |
387 388 389 390 391 |
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 |
392 393 394 |
#undef SHOW_FUNCTION #define STORE_FUNCTION(__FUNC, __PTR, MIN, MAX, __CONV) \ |
b374d18a4 block: get rid of... |
395 |
static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count) \ |
1da177e4c Linux-2.6.12-rc2 |
396 |
{ \ |
3d1ab40f4 [PATCH] elevator_... |
397 |
struct deadline_data *dd = e->elevator_data; \ |
1da177e4c Linux-2.6.12-rc2 |
398 399 400 401 402 403 404 405 406 407 408 409 |
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... |
410 411 412 413 414 |
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 |
415 |
#undef STORE_FUNCTION |
e572ec7e4 [PATCH] fix rmmod... |
416 417 418 419 420 421 422 423 424 425 426 |
#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 |
427 |
}; |
1da177e4c Linux-2.6.12-rc2 |
428 429 430 431 432 |
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... |
433 434 |
.elevator_dispatch_fn = deadline_dispatch_requests, .elevator_add_req_fn = deadline_add_request, |
1da177e4c Linux-2.6.12-rc2 |
435 |
.elevator_queue_empty_fn = deadline_queue_empty, |
b8aca35af [PATCH] deadline-... |
436 437 |
.elevator_former_req_fn = elv_rb_former_request, .elevator_latter_req_fn = elv_rb_latter_request, |
1da177e4c Linux-2.6.12-rc2 |
438 439 440 |
.elevator_init_fn = deadline_init_queue, .elevator_exit_fn = deadline_exit_queue, }, |
3d1ab40f4 [PATCH] elevator_... |
441 |
.elevator_attrs = deadline_attrs, |
1da177e4c Linux-2.6.12-rc2 |
442 443 444 445 446 447 |
.elevator_name = "deadline", .elevator_owner = THIS_MODULE, }; static int __init deadline_init(void) { |
2fdd82bd8 block: let elv_re... |
448 449 450 |
elv_register(&iosched_deadline); return 0; |
1da177e4c Linux-2.6.12-rc2 |
451 452 453 454 |
} static void __exit deadline_exit(void) { |
1da177e4c Linux-2.6.12-rc2 |
455 456 457 458 459 460 461 462 463 |
elv_unregister(&iosched_deadline); } module_init(deadline_init); module_exit(deadline_exit); MODULE_AUTHOR("Jens Axboe"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("deadline IO scheduler"); |