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;
}
}
- 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,
if (!latency)
return -ENOMEM;
- latency[READ] = 8192;
- latency[WRITE] = 16384;
+ latency[READ] = 1024;
+ latency[WRITE] = 2048;
e->elevator_data = latency;
return 0;
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;
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,
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;
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;
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 *);
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;
*/
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 *);
*/
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 ->