#define RQ_RB_ROOT(dd, rq) (&(dd)->sort_list[rq_data_dir((rq))])
+/*
+ * 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;
+}
+
static void
deadline_add_rq_rb(struct deadline_data *dd, struct request *rq)
{
{
const int data_dir = rq_data_dir(rq);
- if (dd->next_rq[data_dir] == rq) {
- struct rb_node *rbnext = rb_next(&rq->rb_node);
-
- dd->next_rq[data_dir] = NULL;
- if (rbnext)
- dd->next_rq[data_dir] = rb_entry_rq(rbnext);
- }
+ if (dd->next_rq[data_dir] == rq)
+ dd->next_rq[data_dir] = deadline_latter_request(rq);
elv_rb_del(RQ_RB_ROOT(dd, rq), rq);
}
deadline_move_request(struct deadline_data *dd, struct request *rq)
{
const int data_dir = rq_data_dir(rq);
- struct rb_node *rbnext = rb_next(&rq->rb_node);
dd->next_rq[READ] = NULL;
dd->next_rq[WRITE] = NULL;
+ dd->next_rq[data_dir] = deadline_latter_request(rq);
- if (rbnext)
- dd->next_rq[data_dir] = rb_entry_rq(rbnext);
-
dd->last_sector = rq->sector + rq->nr_sectors;
/*
dispatch_find_request:
/*
* we are not running a batch, find best request for selected data_dir
+ * and start a new batch
*/
if (deadline_check_fifo(dd, data_dir)) {
/* An expired request exists - satisfy it */
- dd->batching = 0;
rq = rq_entry_fifo(dd->fifo_list[data_dir].next);
-
} else if (dd->next_rq[data_dir]) {
/*
* The last req was the same dir and we have a next request in
* higher-sectored requests. Go back to the lowest sectored
* request (1 way elevator) and start a new batch.
*/
- dd->batching = 0;
node = rb_first(&dd->sort_list[data_dir]);
if (node)
rq = rb_entry_rq(node);
}
+ dd->batching = 0;
+
dispatch_request:
/*
* rq is the selected appropriate request.