--- /opt/kernel/linux-2.5.35/drivers/block/elevator.c 2002-09-16 04:18:48.000000000 +0200 +++ linux/drivers/block/elevator.c 2002-09-16 11:30:23.000000000 +0200 @@ -177,14 +177,9 @@ if (__rq->flags & (REQ_BARRIER | REQ_STARTED)) break; - - /* - * simply "aging" of requests in queue - */ - if (elv_linus_sequence(__rq)-- <= 0) - break; if (!(__rq->flags & REQ_CMD)) continue; + if (elv_linus_sequence(__rq) < bio_sectors(bio)) break; @@ -200,24 +195,20 @@ } } - return ret; -} - -void elevator_linus_merge_cleanup(request_queue_t *q, struct request *req, int count) -{ - struct list_head *entry; - - BUG_ON(req->q != q); - /* - * second pass scan of requests that got passed over, if any + * if *req, it's either a seek or merge in the middle of the queue */ - entry = &req->queuelist; - while ((entry = entry->next) != &q->queue_head) { - struct request *tmp; - tmp = list_entry_rq(entry); - elv_linus_sequence(tmp) -= count; + if (*req) { + struct list_head *entry = &(*req)->queuelist; + int cost = ret ? 1 : ELV_LINUS_SEEK_COST; + + while ((entry = entry->next) != &q->queue_head) { + __rq = list_entry_rq(entry); + elv_linus_sequence(__rq) -= cost; + } } + + return ret; } void elevator_linus_merge_req(request_queue_t *q, struct request *req, @@ -260,8 +251,8 @@ if (!latency) return -ENOMEM; - latency[READ] = 8192; - latency[WRITE] = 16384; + latency[READ] = 1024; + latency[WRITE] = 2048; e->elevator_data = latency; return 0; @@ -355,15 +346,6 @@ return 0; } -void elv_merge_cleanup(request_queue_t *q, struct request *rq, - int nr_sectors) -{ - elevator_t *e = &q->elevator; - - if (e->elevator_merge_cleanup_fn) - e->elevator_merge_cleanup_fn(q, rq, nr_sectors); -} - int elv_merge(request_queue_t *q, struct request **rq, struct bio *bio) { elevator_t *e = &q->elevator; @@ -460,7 +442,6 @@ elevator_t elevator_linus = { elevator_merge_fn: elevator_linus_merge, - elevator_merge_cleanup_fn: elevator_linus_merge_cleanup, elevator_merge_req_fn: elevator_linus_merge_req, elevator_next_req_fn: elevator_noop_next_request, elevator_add_req_fn: elevator_linus_add_request, --- /opt/kernel/linux-2.5.35/drivers/block/ll_rw_blk.c 2002-09-16 04:18:19.000000000 +0200 +++ linux/drivers/block/ll_rw_blk.c 2002-09-16 11:29:41.000000000 +0200 @@ -1508,7 +1508,6 @@ req->biotail->bi_next = bio; req->biotail = bio; req->nr_sectors = req->hard_nr_sectors += nr_sectors; - elv_merge_cleanup(q, req, nr_sectors); drive_stat_acct(req, nr_sectors, 0); attempt_back_merge(q, req); goto out; @@ -1532,7 +1531,6 @@ req->hard_cur_sectors = cur_nr_sectors; req->sector = req->hard_sector = sector; req->nr_sectors = req->hard_nr_sectors += nr_sectors; - elv_merge_cleanup(q, req, nr_sectors); drive_stat_acct(req, nr_sectors, 0); attempt_front_merge(q, req); goto out; --- /opt/kernel/linux-2.5.35/include/linux/elevator.h 2002-09-16 04:18:18.000000000 +0200 +++ linux/include/linux/elevator.h 2002-09-16 11:30:53.000000000 +0200 @@ -4,8 +4,6 @@ typedef int (elevator_merge_fn) (request_queue_t *, struct request **, struct bio *); -typedef void (elevator_merge_cleanup_fn) (request_queue_t *, struct request *, int); - typedef void (elevator_merge_req_fn) (request_queue_t *, struct request *, struct request *); typedef struct request *(elevator_next_req_fn) (request_queue_t *); @@ -21,7 +19,6 @@ struct elevator_s { elevator_merge_fn *elevator_merge_fn; - elevator_merge_cleanup_fn *elevator_merge_cleanup_fn; elevator_merge_req_fn *elevator_merge_req_fn; elevator_next_req_fn *elevator_next_req_fn; @@ -42,7 +39,6 @@ */ extern void __elv_add_request(request_queue_t *, struct request *, struct list_head *); -extern void elv_merge_cleanup(request_queue_t *, struct request *, int); extern int elv_merge(request_queue_t *, struct request **, struct bio *); extern void elv_merge_requests(request_queue_t *, struct request *, struct request *); @@ -61,6 +57,7 @@ */ extern elevator_t elevator_linus; #define elv_linus_sequence(rq) ((long)(rq)->elevator_private) +#define ELV_LINUS_SEEK_COST 16 /* * use the /proc/iosched interface, all the below is history ->