1 diff -u -ur linux-2.4.20/drivers/block/elevator.c linux-iosched-2/drivers/block/elevator.c
2 --- linux-2.4.20/drivers/block/elevator.c 2003-04-14 14:47:22.000000000 -0400
3 +++ linux-iosched-2/drivers/block/elevator.c 2003-05-30 17:28:57.000000000 -0400
8 +int elevator_neil_merge(request_queue_t *q, struct request **req,
9 + struct list_head * head,
10 + struct buffer_head *bh, int rw,
13 + struct list_head *entry = &q->queue_head;
14 + struct request *__rq;
15 + unsigned int count = bh->b_size >> 9, ret = ELEVATOR_NO_MERGE;
16 + unsigned int reads = 0, writes = 0;
17 + /* XXX make tunable? */
18 + unsigned int expire_time = jiffies - 1*HZ;
20 + if (list_empty(&q->queue_head))
23 + /* try to merge requests, fall back to ordering them by sector */
24 + while ((entry = entry->prev) != head) {
25 + __rq = blkdev_entry_to_request(entry);
27 + if (__rq->elevator_sequence <= 0)
29 + if (__rq->cmd == READ)
33 + if (__rq->rq_dev != bh->b_rdev)
37 + if (__rq->cmd != rw)
39 + if (time_before(__rq->start_time, expire_time))
41 + if (bh->b_rsector > __rq->sector)
43 + if (__rq->nr_sectors + count > max_sectors)
45 + if (__rq->sector + __rq->nr_sectors == bh->b_rsector) {
46 + ret = ELEVATOR_BACK_MERGE;
49 + } else if (__rq->sector - count == bh->b_rsector) {
50 + ret = ELEVATOR_FRONT_MERGE;
55 + if (!*req && rw == READ) {
56 + int extra_writes = writes - reads;
58 + * If there are more writes than reads in the queue then put
59 + * read requests ahead of the extra writes. This prevents
60 + * writes from starving reads.
62 + entry = q->queue_head.prev;
63 + while (extra_writes > 0 && entry != head) {
64 + __rq = blkdev_entry_to_request(entry);
65 + if (__rq->cmd == WRITE)
67 + else if (time_before(__rq->start_time, expire_time))
69 + entry = entry->prev;
71 + *req = blkdev_entry_to_request(entry);
77 +void elevator_neil_merge_req(struct request *req, struct request *next)
79 + if (time_before(next->start_time, req->start_time))
80 + req->start_time = next->start_time;
84 int elevator_linus_merge(request_queue_t *q, struct request **req,
85 struct list_head * head,
86 diff -u -ur linux-2.4.20/drivers/block/ll_rw_blk.c linux-iosched-2/drivers/block/ll_rw_blk.c
87 --- linux-2.4.20/drivers/block/ll_rw_blk.c 2003-04-14 14:47:22.000000000 -0400
88 +++ linux-iosched-2/drivers/block/ll_rw_blk.c 2003-05-30 17:27:16.000000000 -0400
90 void blk_init_queue(request_queue_t * q, request_fn_proc * rfn)
92 INIT_LIST_HEAD(&q->queue_head);
93 - elevator_init(&q->elevator, ELEVATOR_LINUS);
94 + elevator_init(&q->elevator, ELEVATOR_NEIL);
95 blk_init_free_list(q);
97 q->back_merge_fn = ll_back_merge_fn;
99 rw = READ; /* drop into READ */
102 - latency = elevator_request_latency(elevator, rw);
103 + /* latency = elevator_request_latency(elevator, rw); */
108 diff -u -ur linux-2.4.20/include/linux/elevator.h linux-iosched-2/include/linux/elevator.h
109 --- linux-2.4.20/include/linux/elevator.h 2003-04-14 14:47:24.000000000 -0400
110 +++ linux-iosched-2/include/linux/elevator.h 2003-05-30 17:27:16.000000000 -0400
112 void elevator_linus_merge_cleanup(request_queue_t *, struct request *, int);
113 void elevator_linus_merge_req(struct request *, struct request *);
115 +int elevator_neil_merge(request_queue_t *, struct request **, struct list_head *, struct buffer_head *, int, int);
116 +void elevator_neil_merge_req(struct request *, struct request *);
118 typedef struct blkelv_ioctl_arg_s {
126 +#define ELEVATOR_NEIL \
128 + 0, /* read_latency */ \
129 + 0, /* write_latency */ \
131 + elevator_neil_merge, /* elevator_merge_fn */ \
132 + elevator_neil_merge_req, /* elevator_merge_req_fn */ \