[PATCH] struct request: shrink and optimize some more
Move some members around and unionize completion_data and rb_node since
they cannot ever be used at the same time.
Signed-off-by: Jens Axboe <axboe@suse.de>
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 8a3e309..a1e2880 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -211,6 +211,8 @@
struct list_head queuelist;
struct list_head donelist;
+ request_queue_t *q;
+
unsigned int cmd_flags;
enum rq_cmd_type_bits cmd_type;
@@ -219,12 +221,12 @@
*/
sector_t sector; /* next sector to submit */
+ sector_t hard_sector; /* next sector to complete */
unsigned long nr_sectors; /* no. of sectors left to submit */
+ unsigned long hard_nr_sectors; /* no. of sectors left to complete */
/* no. of sectors left to submit in the current segment */
unsigned int current_nr_sectors;
- sector_t hard_sector; /* next sector to complete */
- unsigned long hard_nr_sectors; /* no. of sectors left to complete */
/* no. of sectors left to complete in the current segment */
unsigned int hard_cur_sectors;
@@ -232,7 +234,15 @@
struct bio *biotail;
struct hlist_node hash; /* merge hash */
- struct rb_node rb_node; /* sort/lookup */
+ /*
+ * The rb_node is only used inside the io scheduler, requests
+ * are pruned when moved to the dispatch queue. So let the
+ * completion_data share space with the rb_node.
+ */
+ union {
+ struct rb_node rb_node; /* sort/lookup */
+ void *completion_data;
+ };
/*
* two pointers are available for the IO schedulers, if they need
@@ -241,8 +251,6 @@
void *elevator_private;
void *elevator_private2;
- void *completion_data;
-
struct gendisk *rq_disk;
unsigned long start_time;
@@ -260,8 +268,6 @@
unsigned short ioprio;
- request_queue_t *q;
-
void *special;
char *buffer;