* [PATCH 1/2] deadline-iosched: code cleanup, preparation for sync/async patch
@ 2009-05-09 15:35 Corrado Zoccolo
0 siblings, 0 replies; only message in thread
From: Corrado Zoccolo @ 2009-05-09 15:35 UTC (permalink / raw)
To: Jens Axboe; +Cc: Linux-Kernel
This is the first patch of the series, and contains code cleanup
needed before changing read/write to sync/async.
No behavioral change is introduced by this patch.
Code cleanups:
* A single next_rq is sufficient.
* we store fifo insertion time on request, and compute deadline on the
fly, to handle fifo_expire changes better (fifos remain sorted)
* remove unused field
* deadline_latter_request becomes deadline_next_request.
Signed-off-by: Corrado Zoccolo <czoccolo@gmail.com>
---
diff --git a/block/deadline-iosched.c b/block/deadline-iosched.c
index c4d991d..5713595 100644
--- a/block/deadline-iosched.c
+++ b/block/deadline-iosched.c
@@ -35,11 +35,10 @@ struct deadline_data {
struct list_head fifo_list[2];
/*
- * next in sort order. read, write or both are NULL
+ * next in sort order.
*/
- struct request *next_rq[2];
+ struct request *next_rq;
unsigned int batching; /* number of sequential requests made */
- sector_t last_sector; /* head position */
unsigned int starved; /* times reads have starved writes */
/*
@@ -63,7 +62,7 @@ deadline_rb_root(struct deadline_data *dd, struct request *rq)
* get the request after `rq' in sector-sorted order
*/
static inline struct request *
-deadline_latter_request(struct request *rq)
+deadline_next_request(struct request *rq)
{
struct rb_node *node = rb_next(&rq->rb_node);
@@ -86,10 +85,8 @@ deadline_add_rq_rb(struct deadline_data *dd, struct request *rq)
static inline void
deadline_del_rq_rb(struct deadline_data *dd, struct request *rq)
{
- const int data_dir = rq_data_dir(rq);
-
- if (dd->next_rq[data_dir] == rq)
- dd->next_rq[data_dir] = deadline_latter_request(rq);
+ if (dd->next_rq == rq)
+ dd->next_rq = deadline_next_request(rq);
elv_rb_del(deadline_rb_root(dd, rq), rq);
}
@@ -101,15 +98,14 @@ static void
deadline_add_request(struct request_queue *q, struct request *rq)
{
struct deadline_data *dd = q->elevator->elevator_data;
- const int data_dir = rq_data_dir(rq);
deadline_add_rq_rb(dd, rq);
/*
- * set expire time and add to fifo list
+ * set request creation time and add to fifo list
*/
- rq_set_fifo_time(rq, jiffies + dd->fifo_expire[data_dir]);
- list_add_tail(&rq->queuelist, &dd->fifo_list[data_dir]);
+ rq_set_fifo_time(rq, jiffies);
+ list_add_tail(&rq->queuelist, &dd->fifo_list[rq_data_dir(rq)]);
}
/*
@@ -206,13 +202,7 @@ deadline_move_to_dispatch(struct deadline_data *dd, struct request *rq)
static void
deadline_move_request(struct deadline_data *dd, struct request *rq)
{
- const int data_dir = rq_data_dir(rq);
-
- dd->next_rq[READ] = NULL;
- dd->next_rq[WRITE] = NULL;
- dd->next_rq[data_dir] = deadline_latter_request(rq);
-
- dd->last_sector = rq_end_sector(rq);
+ dd->next_rq = deadline_next_request(rq);
/*
* take it off the sort and fifo list, move
@@ -227,15 +217,13 @@ deadline_move_request(struct deadline_data *dd, struct request *rq)
*/
static inline int deadline_check_fifo(struct deadline_data *dd, int ddir)
{
- struct request *rq = rq_entry_fifo(dd->fifo_list[ddir].next);
-
+ BUG_ON(list_empty(&dd->fifo_list[ddir]));
/*
- * rq is expired!
+ * deadline is expired!
*/
- if (time_after(jiffies, rq_fifo_time(rq)))
- return 1;
-
- return 0;
+ return time_after(jiffies, dd->fifo_expire[ddir] +
+ rq_fifo_time(rq_entry_fifo(dd->fifo_list[ddir].next))
+ );
}
/*
@@ -247,20 +235,13 @@ static int deadline_dispatch_requests(struct request_queue *q, int force)
struct deadline_data *dd = q->elevator->elevator_data;
const int reads = !list_empty(&dd->fifo_list[READ]);
const int writes = !list_empty(&dd->fifo_list[WRITE]);
- struct request *rq;
+ struct request *rq = dd->next_rq;
int data_dir;
- /*
- * batches are currently reads XOR writes
- */
- if (dd->next_rq[WRITE])
- rq = dd->next_rq[WRITE];
- else
- rq = dd->next_rq[READ];
-
- if (rq && dd->batching < dd->fifo_batch)
+ if (rq && dd->batching < dd->fifo_batch) {
/* we have a next request are still entitled to batch */
goto dispatch_request;
+ }
/*
* at this point we are not running a batch. select the appropriate
@@ -299,7 +280,9 @@ dispatch_find_request:
/*
* we are not running a batch, find best request for selected data_dir
*/
- if (deadline_check_fifo(dd, data_dir) || !dd->next_rq[data_dir]) {
+ if (!dd->next_rq
+ || rq_data_dir(dd->next_rq) != data_dir
+ || deadline_check_fifo(dd, data_dir)) {
/*
* A deadline has expired, the last request was in the other
* direction, or we have run out of higher-sectored requests.
@@ -311,7 +294,7 @@ dispatch_find_request:
* The last req was the same dir and we have a next request in
* sort order. No expired requests so continue on from here.
*/
- rq = dd->next_rq[data_dir];
+ rq = dd->next_rq;
}
dd->batching = 0;
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2009-05-09 15:35 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-09 15:35 [PATCH 1/2] deadline-iosched: code cleanup, preparation for sync/async patch Corrado Zoccolo
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.