Commit 8b4922d3 authored by Jan Kara's avatar Jan Kara Committed by Jens Axboe

block: Stop abusing csd.list for fifo_time

Block layer currently abuses rq->csd.list.next for storing fifo_time.
That is a terrible hack and completely unnecessary as well. Union
achieves the same space saving in a cleaner way.
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jens Axboe <axboe@fb.com>
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent bf36f9cf
...@@ -2367,10 +2367,10 @@ cfq_merged_requests(struct request_queue *q, struct request *rq, ...@@ -2367,10 +2367,10 @@ cfq_merged_requests(struct request_queue *q, struct request *rq,
* reposition in fifo if next is older than rq * reposition in fifo if next is older than rq
*/ */
if (!list_empty(&rq->queuelist) && !list_empty(&next->queuelist) && if (!list_empty(&rq->queuelist) && !list_empty(&next->queuelist) &&
time_before(rq_fifo_time(next), rq_fifo_time(rq)) && time_before(next->fifo_time, rq->fifo_time) &&
cfqq == RQ_CFQQ(next)) { cfqq == RQ_CFQQ(next)) {
list_move(&rq->queuelist, &next->queuelist); list_move(&rq->queuelist, &next->queuelist);
rq_set_fifo_time(rq, rq_fifo_time(next)); rq->fifo_time = next->fifo_time;
} }
if (cfqq->next_rq == next) if (cfqq->next_rq == next)
...@@ -2814,7 +2814,7 @@ static struct request *cfq_check_fifo(struct cfq_queue *cfqq) ...@@ -2814,7 +2814,7 @@ static struct request *cfq_check_fifo(struct cfq_queue *cfqq)
return NULL; return NULL;
rq = rq_entry_fifo(cfqq->fifo.next); rq = rq_entry_fifo(cfqq->fifo.next);
if (time_before(jiffies, rq_fifo_time(rq))) if (time_before(jiffies, rq->fifo_time))
rq = NULL; rq = NULL;
cfq_log_cfqq(cfqq->cfqd, cfqq, "fifo=%p", rq); cfq_log_cfqq(cfqq->cfqd, cfqq, "fifo=%p", rq);
...@@ -3927,7 +3927,7 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq) ...@@ -3927,7 +3927,7 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq)
cfq_log_cfqq(cfqd, cfqq, "insert_request"); cfq_log_cfqq(cfqd, cfqq, "insert_request");
cfq_init_prio_data(cfqq, RQ_CIC(rq)); cfq_init_prio_data(cfqq, RQ_CIC(rq));
rq_set_fifo_time(rq, jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]); rq->fifo_time = jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)];
list_add_tail(&rq->queuelist, &cfqq->fifo); list_add_tail(&rq->queuelist, &cfqq->fifo);
cfq_add_rq_rb(rq); cfq_add_rq_rb(rq);
cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group, cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group,
......
...@@ -106,7 +106,7 @@ deadline_add_request(struct request_queue *q, struct request *rq) ...@@ -106,7 +106,7 @@ deadline_add_request(struct request_queue *q, struct request *rq)
/* /*
* set expire time and add to fifo list * set expire time and add to fifo list
*/ */
rq_set_fifo_time(rq, jiffies + dd->fifo_expire[data_dir]); rq->fifo_time = jiffies + dd->fifo_expire[data_dir];
list_add_tail(&rq->queuelist, &dd->fifo_list[data_dir]); list_add_tail(&rq->queuelist, &dd->fifo_list[data_dir]);
} }
...@@ -174,9 +174,9 @@ deadline_merged_requests(struct request_queue *q, struct request *req, ...@@ -174,9 +174,9 @@ deadline_merged_requests(struct request_queue *q, struct request *req,
* and move into next position (next will be deleted) in fifo * and move into next position (next will be deleted) in fifo
*/ */
if (!list_empty(&req->queuelist) && !list_empty(&next->queuelist)) { if (!list_empty(&req->queuelist) && !list_empty(&next->queuelist)) {
if (time_before(rq_fifo_time(next), rq_fifo_time(req))) { if (time_before(next->fifo_time, req->fifo_time)) {
list_move(&req->queuelist, &next->queuelist); list_move(&req->queuelist, &next->queuelist);
rq_set_fifo_time(req, rq_fifo_time(next)); req->fifo_time = next->fifo_time;
} }
} }
...@@ -230,7 +230,7 @@ static inline int deadline_check_fifo(struct deadline_data *dd, int ddir) ...@@ -230,7 +230,7 @@ static inline int deadline_check_fifo(struct deadline_data *dd, int ddir)
/* /*
* rq is expired! * rq is expired!
*/ */
if (time_after_eq(jiffies, rq_fifo_time(rq))) if (time_after_eq(jiffies, rq->fifo_time))
return 1; return 1;
return 0; return 0;
......
...@@ -99,6 +99,7 @@ struct request { ...@@ -99,6 +99,7 @@ struct request {
union { union {
struct call_single_data csd; struct call_single_data csd;
struct work_struct mq_flush_work; struct work_struct mq_flush_work;
unsigned long fifo_time;
}; };
struct request_queue *q; struct request_queue *q;
......
...@@ -202,12 +202,6 @@ enum { ...@@ -202,12 +202,6 @@ enum {
#define rq_end_sector(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq)) #define rq_end_sector(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq))
#define rb_entry_rq(node) rb_entry((node), struct request, rb_node) #define rb_entry_rq(node) rb_entry((node), struct request, rb_node)
/*
* Hack to reuse the csd.list list_head as the fifo time holder while
* the request is in the io scheduler. Saves an unsigned long in rq.
*/
#define rq_fifo_time(rq) ((unsigned long) (rq)->csd.list.next)
#define rq_set_fifo_time(rq,exp) ((rq)->csd.list.next = (void *) (exp))
#define rq_entry_fifo(ptr) list_entry((ptr), struct request, queuelist) #define rq_entry_fifo(ptr) list_entry((ptr), struct request, queuelist)
#define rq_fifo_clear(rq) do { \ #define rq_fifo_clear(rq) do { \
list_del_init(&(rq)->queuelist); \ list_del_init(&(rq)->queuelist); \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment