diff -urN 2.2.14/drivers/block/ll_rw_blk.c 2.2.14-elevator/drivers/block/ll_rw_blk.c --- 2.2.14/drivers/block/ll_rw_blk.c Fri Jan 7 18:19:10 2000 +++ 2.2.14-elevator/drivers/block/ll_rw_blk.c Sun Jan 23 17:52:40 2000 @@ -3,6 +3,7 @@ * * Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1994, Karl Keyte: Added support for disk statistics + * Fixed elevator starvation, 2000 Andrea Arcangeli */ /* @@ -334,6 +335,7 @@ } req->next = NULL; + req->allow_reorder = 1; /* * We use the goto to reduce locking complexity @@ -353,6 +355,8 @@ const int after_current = IN_ORDER(tmp,req); const int before_next = IN_ORDER(req,tmp->next); + if (!tmp->next->allow_reorder) + continue; if (!IN_ORDER(tmp,tmp->next)) { if (after_current || before_next) break; @@ -362,6 +366,11 @@ } } req->next = tmp->next; + if (req->next) + { + req->allow_reorder = 0; + req->next->allow_reorder = 0; + } tmp->next = req; /* for SCSI devices, call request_fn unconditionally */ @@ -389,6 +398,8 @@ if (!next) return; + if (req->allow_reorder != next->allow_reorder) + return; if (req->sector + req->nr_sectors != next->sector) return; if (next->sem || req->cmd != next->cmd || req->rq_dev != next->rq_dev || @@ -565,6 +576,8 @@ continue; /* Can we add it to the end of this request? */ if (req->sector + req->nr_sectors == sector) { + if (req->next && !req->allow_reorder) + continue; if (req->bhtail->b_data + req->bhtail->b_size != bh->b_data) { if (req->nr_segments < max_segments) @@ -574,10 +587,14 @@ req->bhtail->b_reqnext = bh; req->bhtail = bh; req->nr_sectors += count; + if (req->next) + req->next->allow_reorder = 0; /* Can we now merge this req with the next? */ attempt_merge(req, max_sectors, max_segments); /* or to the beginning? */ } else if (req->sector - count == sector) { + if (!req->allow_reorder) + continue; if (bh->b_data + bh->b_size != req->bh->b_data) { if (req->nr_segments < max_segments) @@ -590,6 +607,7 @@ req->current_nr_sectors = count; req->sector = sector; req->nr_sectors += count; + req->allow_reorder = 0; } else continue; diff -urN 2.2.14/include/linux/blkdev.h 2.2.14-elevator/include/linux/blkdev.h --- 2.2.14/include/linux/blkdev.h Sat Jan 22 15:37:27 2000 +++ 2.2.14-elevator/include/linux/blkdev.h Sun Jan 23 16:51:11 2000 @@ -32,6 +32,7 @@ struct buffer_head * bh; struct buffer_head * bhtail; struct request * next; + int allow_reorder; }; typedef void (request_fn_proc) (void);