block: fixup rq_init() a bit

Rearrange fields in cache order and initialize some fields that
we didn't previously init. Remove init of ->completion_data, it's
part of a union with ->hash. Luckily clearing the rb node is the same
as setting it to null!

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

+24 -11
+21 -10
block/blk-core.c
··· 102 102 } 103 103 EXPORT_SYMBOL(blk_get_backing_dev_info); 104 104 105 + /* 106 + * We can't just memset() the structure, since the allocation path 107 + * already stored some information in the request. 108 + */ 105 109 void rq_init(struct request_queue *q, struct request *rq) 106 110 { 107 111 INIT_LIST_HEAD(&rq->queuelist); 108 112 INIT_LIST_HEAD(&rq->donelist); 109 - 110 - rq->errors = 0; 113 + rq->q = q; 114 + rq->sector = rq->hard_sector = (sector_t) -1; 115 + rq->nr_sectors = rq->hard_nr_sectors = 0; 116 + rq->current_nr_sectors = rq->hard_cur_sectors = 0; 111 117 rq->bio = rq->biotail = NULL; 112 118 INIT_HLIST_NODE(&rq->hash); 113 119 RB_CLEAR_NODE(&rq->rb_node); 114 - rq->ioprio = 0; 115 - rq->buffer = NULL; 116 - rq->ref_count = 1; 117 - rq->q = q; 118 - rq->special = NULL; 119 - rq->data_len = 0; 120 - rq->data = NULL; 120 + rq->rq_disk = NULL; 121 121 rq->nr_phys_segments = 0; 122 + rq->nr_hw_segments = 0; 123 + rq->ioprio = 0; 124 + rq->special = NULL; 125 + rq->buffer = NULL; 126 + rq->tag = -1; 127 + rq->errors = 0; 128 + rq->ref_count = 1; 129 + rq->cmd_len = 0; 130 + memset(rq->cmd, 0, sizeof(rq->cmd)); 131 + rq->data_len = 0; 132 + rq->sense_len = 0; 133 + rq->data = NULL; 122 134 rq->sense = NULL; 123 135 rq->end_io = NULL; 124 136 rq->end_io_data = NULL; 125 - rq->completion_data = NULL; 126 137 rq->next_rq = NULL; 127 138 } 128 139
+3 -1
include/linux/blkdev.h
··· 137 137 #define BLK_MAX_CDB 16 138 138 139 139 /* 140 - * try to put the fields that are referenced together in the same cacheline 140 + * try to put the fields that are referenced together in the same cacheline. 141 + * if you modify this structure, be sure to check block/blk-core.c:rq_init() 142 + * as well! 141 143 */ 142 144 struct request { 143 145 struct list_head queuelist;