Blame view
block/deadline-iosched.c
13.2 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 |
unsigned int batching; /* number of sequential requests made */ |
1da177e4c Linux-2.6.12-rc2 |
41 42 43 44 45 46 47 48 49 |
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 |
50 |
}; |
4fb72f764 deadline-iosched:... |
51 52 53 54 55 |
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 |
56 |
|
5d1a53662 Deadline iosched:... |
57 58 59 60 61 62 63 64 65 66 67 68 69 |
/* * 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 |
70 |
static void |
8840faa1e [PATCH] deadline-... |
71 |
deadline_add_rq_rb(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
72 |
{ |
4fb72f764 deadline-iosched:... |
73 |
struct rb_root *root = deadline_rb_root(dd, rq); |
1da177e4c Linux-2.6.12-rc2 |
74 |
|
796d5116c iosched: prevent ... |
75 |
elv_rb_add(root, rq); |
1da177e4c Linux-2.6.12-rc2 |
76 77 78 |
} static inline void |
8840faa1e [PATCH] deadline-... |
79 |
deadline_del_rq_rb(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
80 |
{ |
b8aca35af [PATCH] deadline-... |
81 |
const int data_dir = rq_data_dir(rq); |
1da177e4c Linux-2.6.12-rc2 |
82 |
|
5d1a53662 Deadline iosched:... |
83 84 |
if (dd->next_rq[data_dir] == rq) dd->next_rq[data_dir] = deadline_latter_request(rq); |
1da177e4c Linux-2.6.12-rc2 |
85 |
|
4fb72f764 deadline-iosched:... |
86 |
elv_rb_del(deadline_rb_root(dd, rq), rq); |
1da177e4c Linux-2.6.12-rc2 |
87 88 89 |
} /* |
8840faa1e [PATCH] deadline-... |
90 |
* add rq to rbtree and fifo |
1da177e4c Linux-2.6.12-rc2 |
91 |
*/ |
b4878f245 [PATCH] 02/05: up... |
92 |
static void |
1da177e4c Linux-2.6.12-rc2 |
93 94 95 |
deadline_add_request(struct request_queue *q, struct request *rq) { struct deadline_data *dd = q->elevator->elevator_data; |
8840faa1e [PATCH] deadline-... |
96 |
const int data_dir = rq_data_dir(rq); |
1da177e4c Linux-2.6.12-rc2 |
97 |
|
8dc8146f9 deadline-iosched:... |
98 99 100 101 102 |
/* * This may be a requeue of a write request that has locked its * target zone. If it is the case, this releases the zone lock. */ blk_req_zone_write_unlock(rq); |
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 |
*/ |
8b4922d31 block: Stop abusi... |
108 |
rq->fifo_time = jiffies + dd->fifo_expire[data_dir]; |
8840faa1e [PATCH] deadline-... |
109 |
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 |
} |
34fe7c054 block: enumify EL... |
122 |
static enum elv_merge |
165125e1e [BLOCK] Get rid o... |
123 |
deadline_merge(struct request_queue *q, struct request **req, struct bio *bio) |
1da177e4c Linux-2.6.12-rc2 |
124 125 126 |
{ struct deadline_data *dd = q->elevator->elevator_data; struct request *__rq; |
1da177e4c Linux-2.6.12-rc2 |
127 128 |
/* |
1da177e4c Linux-2.6.12-rc2 |
129 130 131 |
* check for front merge */ if (dd->front_merges) { |
f73a1c7d1 block: Add bio_en... |
132 |
sector_t sector = bio_end_sector(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 |
|
72ef799b3 block: do not mer... |
138 |
if (elv_bio_merge_ok(__rq, bio)) { |
34fe7c054 block: enumify EL... |
139 140 |
*req = __rq; return ELEVATOR_FRONT_MERGE; |
1da177e4c Linux-2.6.12-rc2 |
141 142 143 144 145 |
} } } return ELEVATOR_NO_MERGE; |
1da177e4c Linux-2.6.12-rc2 |
146 |
} |
165125e1e [BLOCK] Get rid o... |
147 |
static void deadline_merged_request(struct request_queue *q, |
34fe7c054 block: enumify EL... |
148 |
struct request *req, enum elv_merge type) |
1da177e4c Linux-2.6.12-rc2 |
149 150 |
{ struct deadline_data *dd = q->elevator->elevator_data; |
1da177e4c Linux-2.6.12-rc2 |
151 152 |
/* |
1da177e4c Linux-2.6.12-rc2 |
153 154 |
* if the merge was a front merge, we need to reposition request */ |
b8aca35af [PATCH] deadline-... |
155 |
if (type == ELEVATOR_FRONT_MERGE) { |
4fb72f764 deadline-iosched:... |
156 |
elv_rb_del(deadline_rb_root(dd, req), req); |
8840faa1e [PATCH] deadline-... |
157 |
deadline_add_rq_rb(dd, req); |
1da177e4c Linux-2.6.12-rc2 |
158 |
} |
1da177e4c Linux-2.6.12-rc2 |
159 160 161 |
} static void |
165125e1e [BLOCK] Get rid o... |
162 |
deadline_merged_requests(struct request_queue *q, struct request *req, |
1da177e4c Linux-2.6.12-rc2 |
163 164 |
struct request *next) { |
1da177e4c Linux-2.6.12-rc2 |
165 |
/* |
8840faa1e [PATCH] deadline-... |
166 167 |
* 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 |
168 |
*/ |
8840faa1e [PATCH] deadline-... |
169 |
if (!list_empty(&req->queuelist) && !list_empty(&next->queuelist)) { |
9828c2c6c block: Convert fi... |
170 171 |
if (time_before((unsigned long)next->fifo_time, (unsigned long)req->fifo_time)) { |
8840faa1e [PATCH] deadline-... |
172 |
list_move(&req->queuelist, &next->queuelist); |
8b4922d31 block: Stop abusi... |
173 |
req->fifo_time = next->fifo_time; |
1da177e4c Linux-2.6.12-rc2 |
174 175 176 177 178 179 180 181 182 183 184 185 186 |
} } /* * 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-... |
187 |
deadline_move_to_dispatch(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
188 |
{ |
165125e1e [BLOCK] Get rid o... |
189 |
struct request_queue *q = rq->q; |
1da177e4c Linux-2.6.12-rc2 |
190 |
|
8dc8146f9 deadline-iosched:... |
191 192 193 194 195 |
/* * For a zoned block device, write requests must write lock their * target zone. */ blk_req_zone_write_lock(rq); |
8840faa1e [PATCH] deadline-... |
196 197 |
deadline_remove_request(q, rq); elv_dispatch_add_tail(q, rq); |
1da177e4c Linux-2.6.12-rc2 |
198 199 200 201 202 203 |
} /* * move an entry to dispatch queue */ static void |
8840faa1e [PATCH] deadline-... |
204 |
deadline_move_request(struct deadline_data *dd, struct request *rq) |
1da177e4c Linux-2.6.12-rc2 |
205 |
{ |
b8aca35af [PATCH] deadline-... |
206 |
const int data_dir = rq_data_dir(rq); |
1da177e4c Linux-2.6.12-rc2 |
207 |
|
8840faa1e [PATCH] deadline-... |
208 209 |
dd->next_rq[READ] = NULL; dd->next_rq[WRITE] = NULL; |
5d1a53662 Deadline iosched:... |
210 |
dd->next_rq[data_dir] = deadline_latter_request(rq); |
1da177e4c Linux-2.6.12-rc2 |
211 |
|
1da177e4c Linux-2.6.12-rc2 |
212 213 214 215 |
/* * take it off the sort and fifo list, move * to dispatch queue */ |
8840faa1e [PATCH] deadline-... |
216 |
deadline_move_to_dispatch(dd, rq); |
1da177e4c Linux-2.6.12-rc2 |
217 |
} |
1da177e4c Linux-2.6.12-rc2 |
218 |
/* |
4fb72f764 deadline-iosched:... |
219 |
* deadline_check_fifo returns 0 if there are no expired requests on the fifo, |
1da177e4c Linux-2.6.12-rc2 |
220 221 222 223 |
* 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-... |
224 |
struct request *rq = rq_entry_fifo(dd->fifo_list[ddir].next); |
1da177e4c Linux-2.6.12-rc2 |
225 226 |
/* |
8840faa1e [PATCH] deadline-... |
227 |
* rq is expired! |
1da177e4c Linux-2.6.12-rc2 |
228 |
*/ |
9828c2c6c block: Convert fi... |
229 |
if (time_after_eq(jiffies, (unsigned long)rq->fifo_time)) |
1da177e4c Linux-2.6.12-rc2 |
230 231 232 233 234 235 |
return 1; return 0; } /* |
c117bac70 deadline-iosched:... |
236 237 238 239 240 241 |
* For the specified data direction, return the next request to dispatch using * arrival ordered lists. */ static struct request * deadline_fifo_request(struct deadline_data *dd, int data_dir) { |
8dc8146f9 deadline-iosched:... |
242 |
struct request *rq; |
c117bac70 deadline-iosched:... |
243 244 245 246 247 |
if (WARN_ON_ONCE(data_dir != READ && data_dir != WRITE)) return NULL; if (list_empty(&dd->fifo_list[data_dir])) return NULL; |
8dc8146f9 deadline-iosched:... |
248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
rq = rq_entry_fifo(dd->fifo_list[data_dir].next); if (data_dir == READ || !blk_queue_is_zoned(rq->q)) return rq; /* * Look for a write request that can be dispatched, that is one with * an unlocked target zone. */ list_for_each_entry(rq, &dd->fifo_list[WRITE], queuelist) { if (blk_req_can_dispatch_to_zone(rq)) return rq; } return NULL; |
c117bac70 deadline-iosched:... |
262 263 264 265 266 267 268 269 270 |
} /* * For the specified data direction, return the next request to dispatch using * sector position sorted lists. */ static struct request * deadline_next_request(struct deadline_data *dd, int data_dir) { |
8dc8146f9 deadline-iosched:... |
271 |
struct request *rq; |
c117bac70 deadline-iosched:... |
272 273 |
if (WARN_ON_ONCE(data_dir != READ && data_dir != WRITE)) return NULL; |
8dc8146f9 deadline-iosched:... |
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 |
rq = dd->next_rq[data_dir]; if (!rq) return NULL; if (data_dir == READ || !blk_queue_is_zoned(rq->q)) return rq; /* * Look for a write request that can be dispatched, that is one with * an unlocked target zone. */ while (rq) { if (blk_req_can_dispatch_to_zone(rq)) return rq; rq = deadline_latter_request(rq); } return NULL; |
c117bac70 deadline-iosched:... |
292 293 294 |
} /* |
1da177e4c Linux-2.6.12-rc2 |
295 296 297 |
* deadline_dispatch_requests selects the best request according to * read/write expire, fifo_batch, etc */ |
165125e1e [BLOCK] Get rid o... |
298 |
static int deadline_dispatch_requests(struct request_queue *q, int force) |
1da177e4c Linux-2.6.12-rc2 |
299 |
{ |
b4878f245 [PATCH] 02/05: up... |
300 |
struct deadline_data *dd = q->elevator->elevator_data; |
1da177e4c Linux-2.6.12-rc2 |
301 302 |
const int reads = !list_empty(&dd->fifo_list[READ]); const int writes = !list_empty(&dd->fifo_list[WRITE]); |
c117bac70 deadline-iosched:... |
303 |
struct request *rq, *next_rq; |
4b0dc07e6 [PATCH] cleanup o... |
304 |
int data_dir; |
1da177e4c Linux-2.6.12-rc2 |
305 306 307 308 |
/* * batches are currently reads XOR writes */ |
c117bac70 deadline-iosched:... |
309 310 311 |
rq = deadline_next_request(dd, WRITE); if (!rq) rq = deadline_next_request(dd, READ); |
1da177e4c Linux-2.6.12-rc2 |
312 |
|
63de428b1 deadline-iosched:... |
313 314 315 |
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 |
316 317 318 319 320 321 322 |
/* * at this point we are not running a batch. select the appropriate * data direction (read / write) */ if (reads) { |
dd67d0515 [PATCH] rbtree: s... |
323 |
BUG_ON(RB_EMPTY_ROOT(&dd->sort_list[READ])); |
1da177e4c Linux-2.6.12-rc2 |
324 |
|
8dc8146f9 deadline-iosched:... |
325 326 |
if (deadline_fifo_request(dd, WRITE) && (dd->starved++ >= dd->writes_starved)) |
1da177e4c Linux-2.6.12-rc2 |
327 328 329 |
goto dispatch_writes; data_dir = READ; |
1da177e4c Linux-2.6.12-rc2 |
330 331 332 333 334 335 336 337 338 339 |
goto dispatch_find_request; } /* * there are either no reads or writes have been starved */ if (writes) { dispatch_writes: |
dd67d0515 [PATCH] rbtree: s... |
340 |
BUG_ON(RB_EMPTY_ROOT(&dd->sort_list[WRITE])); |
1da177e4c Linux-2.6.12-rc2 |
341 342 343 344 |
dd->starved = 0; data_dir = WRITE; |
1da177e4c Linux-2.6.12-rc2 |
345 346 347 348 349 350 351 352 353 354 |
goto dispatch_find_request; } return 0; dispatch_find_request: /* * we are not running a batch, find best request for selected data_dir */ |
c117bac70 deadline-iosched:... |
355 356 |
next_rq = deadline_next_request(dd, data_dir); if (deadline_check_fifo(dd, data_dir) || !next_rq) { |
6f5d8aa63 Deadline iosched:... |
357 358 359 360 361 |
/* * 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. */ |
c117bac70 deadline-iosched:... |
362 |
rq = deadline_fifo_request(dd, data_dir); |
6f5d8aa63 Deadline iosched:... |
363 |
} else { |
1da177e4c Linux-2.6.12-rc2 |
364 365 366 367 |
/* * The last req was the same dir and we have a next request in * sort order. No expired requests so continue on from here. */ |
c117bac70 deadline-iosched:... |
368 |
rq = next_rq; |
1da177e4c Linux-2.6.12-rc2 |
369 |
} |
8dc8146f9 deadline-iosched:... |
370 371 372 373 374 375 |
/* * For a zoned block device, if we only have writes queued and none of * them can be dispatched, rq will be NULL. */ if (!rq) return 0; |
dfb3d72a9 Deadline iosched:... |
376 |
dd->batching = 0; |
1da177e4c Linux-2.6.12-rc2 |
377 378 |
dispatch_request: /* |
8840faa1e [PATCH] deadline-... |
379 |
* rq is the selected appropriate request. |
1da177e4c Linux-2.6.12-rc2 |
380 381 |
*/ dd->batching++; |
8840faa1e [PATCH] deadline-... |
382 |
deadline_move_request(dd, rq); |
1da177e4c Linux-2.6.12-rc2 |
383 384 385 |
return 1; } |
8dc8146f9 deadline-iosched:... |
386 387 388 389 390 391 392 393 394 |
/* * For zoned block devices, write unlock the target zone of completed * write requests. */ static void deadline_completed_request(struct request_queue *q, struct request *rq) { blk_req_zone_write_unlock(rq); } |
b374d18a4 block: get rid of... |
395 |
static void deadline_exit_queue(struct elevator_queue *e) |
1da177e4c Linux-2.6.12-rc2 |
396 397 398 399 400 |
{ 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 |
401 402 403 404 |
kfree(dd); } /* |
8840faa1e [PATCH] deadline-... |
405 |
* initialize elevator private data (deadline_data). |
1da177e4c Linux-2.6.12-rc2 |
406 |
*/ |
d50235b7b elevator: Fix a r... |
407 |
static int deadline_init_queue(struct request_queue *q, struct elevator_type *e) |
1da177e4c Linux-2.6.12-rc2 |
408 409 |
{ struct deadline_data *dd; |
d50235b7b elevator: Fix a r... |
410 411 412 413 414 |
struct elevator_queue *eq; eq = elevator_alloc(q, e); if (!eq) return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
415 |
|
c1b511eb2 block: Convert km... |
416 |
dd = kzalloc_node(sizeof(*dd), GFP_KERNEL, q->node); |
d50235b7b elevator: Fix a r... |
417 418 |
if (!dd) { kobject_put(&eq->kobj); |
b2fab5acd elevator: make el... |
419 |
return -ENOMEM; |
d50235b7b elevator: Fix a r... |
420 421 |
} eq->elevator_data = dd; |
1da177e4c Linux-2.6.12-rc2 |
422 |
|
1da177e4c Linux-2.6.12-rc2 |
423 424 425 426 |
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 |
427 428 429 430 431 |
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; |
b2fab5acd elevator: make el... |
432 |
|
d50235b7b elevator: Fix a r... |
433 434 435 |
spin_lock_irq(q->queue_lock); q->elevator = eq; spin_unlock_irq(q->queue_lock); |
b2fab5acd elevator: make el... |
436 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
437 |
} |
1da177e4c Linux-2.6.12-rc2 |
438 439 440 |
/* * sysfs parts below */ |
1da177e4c Linux-2.6.12-rc2 |
441 442 443 444 445 446 447 |
static ssize_t deadline_var_show(int var, char *page) { return sprintf(page, "%d ", var); } |
235f8da11 block, scheduler:... |
448 449 |
static void deadline_var_store(int *var, const char *page) |
1da177e4c Linux-2.6.12-rc2 |
450 451 452 453 |
{ char *p = (char *) page; *var = simple_strtol(p, &p, 10); |
1da177e4c Linux-2.6.12-rc2 |
454 455 456 |
} #define SHOW_FUNCTION(__FUNC, __VAR, __CONV) \ |
b374d18a4 block: get rid of... |
457 |
static ssize_t __FUNC(struct elevator_queue *e, char *page) \ |
1da177e4c Linux-2.6.12-rc2 |
458 |
{ \ |
3d1ab40f4 [PATCH] elevator_... |
459 460 |
struct deadline_data *dd = e->elevator_data; \ int __data = __VAR; \ |
1da177e4c Linux-2.6.12-rc2 |
461 462 463 464 |
if (__CONV) \ __data = jiffies_to_msecs(__data); \ return deadline_var_show(__data, (page)); \ } |
e572ec7e4 [PATCH] fix rmmod... |
465 466 467 468 469 |
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 |
470 471 472 |
#undef SHOW_FUNCTION #define STORE_FUNCTION(__FUNC, __PTR, MIN, MAX, __CONV) \ |
b374d18a4 block: get rid of... |
473 |
static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count) \ |
1da177e4c Linux-2.6.12-rc2 |
474 |
{ \ |
3d1ab40f4 [PATCH] elevator_... |
475 |
struct deadline_data *dd = e->elevator_data; \ |
1da177e4c Linux-2.6.12-rc2 |
476 |
int __data; \ |
235f8da11 block, scheduler:... |
477 |
deadline_var_store(&__data, (page)); \ |
1da177e4c Linux-2.6.12-rc2 |
478 479 480 481 482 483 484 485 |
if (__data < (MIN)) \ __data = (MIN); \ else if (__data > (MAX)) \ __data = (MAX); \ if (__CONV) \ *(__PTR) = msecs_to_jiffies(__data); \ else \ *(__PTR) = __data; \ |
235f8da11 block, scheduler:... |
486 |
return count; \ |
1da177e4c Linux-2.6.12-rc2 |
487 |
} |
e572ec7e4 [PATCH] fix rmmod... |
488 489 490 491 492 |
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 |
493 |
#undef STORE_FUNCTION |
e572ec7e4 [PATCH] fix rmmod... |
494 |
#define DD_ATTR(name) \ |
5657a819a block drivers/blo... |
495 |
__ATTR(name, 0644, deadline_##name##_show, deadline_##name##_store) |
e572ec7e4 [PATCH] fix rmmod... |
496 497 498 499 500 501 502 503 |
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 |
504 |
}; |
1da177e4c Linux-2.6.12-rc2 |
505 |
static struct elevator_type iosched_deadline = { |
c51ca6cf5 block: move exist... |
506 |
.ops.sq = { |
1da177e4c Linux-2.6.12-rc2 |
507 508 509 |
.elevator_merge_fn = deadline_merge, .elevator_merged_fn = deadline_merged_request, .elevator_merge_req_fn = deadline_merged_requests, |
b4878f245 [PATCH] 02/05: up... |
510 |
.elevator_dispatch_fn = deadline_dispatch_requests, |
8dc8146f9 deadline-iosched:... |
511 |
.elevator_completed_req_fn = deadline_completed_request, |
b4878f245 [PATCH] 02/05: up... |
512 |
.elevator_add_req_fn = deadline_add_request, |
b8aca35af [PATCH] deadline-... |
513 514 |
.elevator_former_req_fn = elv_rb_former_request, .elevator_latter_req_fn = elv_rb_latter_request, |
1da177e4c Linux-2.6.12-rc2 |
515 516 517 |
.elevator_init_fn = deadline_init_queue, .elevator_exit_fn = deadline_exit_queue, }, |
3d1ab40f4 [PATCH] elevator_... |
518 |
.elevator_attrs = deadline_attrs, |
1da177e4c Linux-2.6.12-rc2 |
519 520 521 522 523 524 |
.elevator_name = "deadline", .elevator_owner = THIS_MODULE, }; static int __init deadline_init(void) { |
3d3c2379f block, cfq: move ... |
525 |
return elv_register(&iosched_deadline); |
1da177e4c Linux-2.6.12-rc2 |
526 527 528 529 |
} static void __exit deadline_exit(void) { |
1da177e4c Linux-2.6.12-rc2 |
530 531 532 533 534 535 536 537 538 |
elv_unregister(&iosched_deadline); } module_init(deadline_init); module_exit(deadline_exit); MODULE_AUTHOR("Jens Axboe"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("deadline IO scheduler"); |