History

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.

Jan Kara committed 12 years ago

Commit 8b4922d1 parent bf36f9c4 files · +9 −14Browse files

Unified · Split

4 files
  1. block/cfq-iosched.c +4 −4
  2. block/deadline-iosched.c +4 −4
  3. include/linux/blkdev.h +1 −0
  4. include/linux/elevator.h +0 −6
block/cfq-iosched.c+4−4
@@ -2367,10 +2367,10 @@ cfq_merged_requests(struct request_queue *q, struct request *rq, · 2366 unmodified lines
2367 * reposition in fifo if next is older than rq2367 * reposition in fifo if next is older than rq
2368 */2368 */
2369 if (!list_empty(&rq->queuelist) && !list_empty(&next->queuelist) &&2369 if (!list_empty(&rq->queuelist) && !list_empty(&next->queuelist) &&
2370 time_before(rq_fifo_time(next), rq_fifo_time(rq)) &&2370 time_before(next->fifo_time, rq->fifo_time) &&
2371 cfqq == RQ_CFQQ(next)) {2371 cfqq == RQ_CFQQ(next)) {
2372 list_move(&rq->queuelist, &next->queuelist);2372 list_move(&rq->queuelist, &next->queuelist);
2373 rq_set_fifo_time(rq, rq_fifo_time(next));2373 rq->fifo_time = next->fifo_time;
2374 }2374 }
2375 2375
2376 if (cfqq->next_rq == next)2376 if (cfqq->next_rq == next)
@@ -2814,7 +2814,7 @@ static struct request *cfq_check_fifo(struct cfq_queue *cfqq) · 437 unmodified lines
2814 return NULL;2814 return NULL;
2815 2815
2816 rq = rq_entry_fifo(cfqq->fifo.next);2816 rq = rq_entry_fifo(cfqq->fifo.next);
2817 if (time_before(jiffies, rq_fifo_time(rq)))2817 if (time_before(jiffies, rq->fifo_time))
2818 rq = NULL;2818 rq = NULL;
2819 2819
2820 cfq_log_cfqq(cfqq->cfqd, cfqq, "fifo=%p", rq);2820 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) · 1106 unmodified lines
3927 cfq_log_cfqq(cfqd, cfqq, "insert_request");3927 cfq_log_cfqq(cfqd, cfqq, "insert_request");
3928 cfq_init_prio_data(cfqq, RQ_CIC(rq));3928 cfq_init_prio_data(cfqq, RQ_CIC(rq));
3929 3929
3930 rq_set_fifo_time(rq, jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]);3930 rq->fifo_time = jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)];
3931 list_add_tail(&rq->queuelist, &cfqq->fifo);3931 list_add_tail(&rq->queuelist, &cfqq->fifo);
3932 cfq_add_rq_rb(rq);3932 cfq_add_rq_rb(rq);
3933 cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group,3933 cfqg_stats_update_io_add(RQ_CFQG(rq), cfqd->serving_group,
block/deadline-iosched.c+4−4
@@ -106,7 +106,7 @@ deadline_add_request(struct request_queue *q, struct request *rq) · 105 unmodified lines
106 /*106 /*
107 * set expire time and add to fifo list107 * set expire time and add to fifo list
108 */108 */
109 rq_set_fifo_time(rq, jiffies + dd->fifo_expire[data_dir]);109 rq->fifo_time = jiffies + dd->fifo_expire[data_dir];
110 list_add_tail(&rq->queuelist, &dd->fifo_list[data_dir]);110 list_add_tail(&rq->queuelist, &dd->fifo_list[data_dir]);
111}111}
112 112
@@ -174,9 +174,9 @@ deadline_merged_requests(struct request_queue *q, struct request *req, · 61 unmodified lines
174 * and move into next position (next will be deleted) in fifo174 * and move into next position (next will be deleted) in fifo
175 */175 */
176 if (!list_empty(&req->queuelist) && !list_empty(&next->queuelist)) {176 if (!list_empty(&req->queuelist) && !list_empty(&next->queuelist)) {
177 if (time_before(rq_fifo_time(next), rq_fifo_time(req))) {177 if (time_before(next->fifo_time, req->fifo_time)) {
178 list_move(&req->queuelist, &next->queuelist);178 list_move(&req->queuelist, &next->queuelist);
179 rq_set_fifo_time(req, rq_fifo_time(next));179 req->fifo_time = next->fifo_time;
180 }180 }
181 }181 }
182 182
@@ -230,7 +230,7 @@ static inline int deadline_check_fifo(struct deadline_data *dd, int ddir) · 47 unmodified lines
230 /*230 /*
231 * rq is expired!231 * rq is expired!
232 */232 */
233 if (time_after_eq(jiffies, rq_fifo_time(rq)))233 if (time_after_eq(jiffies, rq->fifo_time))
234 return 1;234 return 1;
235 235
236 return 0;236 return 0;
include/linux/blkdev.h+1−0
@@ -99,6 +99,7 @@ struct request { · 98 unmodified lines
99 union {99 union {
100 struct call_single_data csd;100 struct call_single_data csd;
101 struct work_struct mq_flush_work;101 struct work_struct mq_flush_work;
102 unsigned long fifo_time;
102 };103 };
103 104
104 struct request_queue *q;105 struct request_queue *q;
include/linux/elevator.h+0−6
@@ -202,12 +202,6 @@ enum { · 201 unmodified lines
202#define rq_end_sector(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq))202#define rq_end_sector(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq))
203#define rb_entry_rq(node) rb_entry((node), struct request, rb_node)203#define rb_entry_rq(node) rb_entry((node), struct request, rb_node)
204 204
205/*
206 * Hack to reuse the csd.list list_head as the fifo time holder while
207 * the request is in the io scheduler. Saves an unsigned long in rq.
208 */
209#define rq_fifo_time(rq) ((unsigned long) (rq)->csd.list.next)
210#define rq_set_fifo_time(rq,exp) ((rq)->csd.list.next = (void *) (exp))
211#define rq_entry_fifo(ptr) list_entry((ptr), struct request, queuelist)205#define rq_entry_fifo(ptr) list_entry((ptr), struct request, queuelist)
212#define rq_fifo_clear(rq) do { \206#define rq_fifo_clear(rq) do { \
213 list_del_init(&(rq)->queuelist); \207 list_del_init(&(rq)->queuelist); \