bio はブロック I/O の略のはずです。
まあ知らんですけど、名前の由来はそれ以外にないと思います。
struct bio は struct bio_vec というリストからページにマッピングされます。
// /usr/src/linux-headers-4.18.16-041816-generic/include/linux/blk_types.h 140 /* 141 * main unit of I/O for the block layer and lower layers (ie drivers and 142 * stacking drivers) 143 */ 144 struct bio { 145 struct bio *bi_next; /* request queue link */ 146 struct gendisk *bi_disk; 147 unsigned int bi_opf; /* bottom bits req flags, 148 * top bits REQ_OP. Use 149 * accessors. 150 */ 151 unsigned short bi_flags; /* status, etc and bvec pool number */ 152 unsigned short bi_ioprio; 153 unsigned short bi_write_hint; 154 blk_status_t bi_status; 155 u8 bi_partno; 156 157 /* Number of segments in this BIO after 158 * physical address coalescing is performed. 159 */ 160 unsigned int bi_phys_segments; 161 162 /* 163 * To keep track of the max segment size, we account for the 164 * sizes of the first and last mergeable segments in this bio. 165 */ 166 unsigned int bi_seg_front_size; 167 unsigned int bi_seg_back_size; 168 169 struct bvec_iter bi_iter; 170 171 atomic_t __bi_remaining; 172 bio_end_io_t *bi_end_io; 173 174 void *bi_private; 175 #ifdef CONFIG_BLK_CGROUP 176 /* 177 * Optional ioc and css associated with this bio. Put on bio 178 * release. Read comment on top of bio_associate_current(). 179 */ 180 struct io_context *bi_ioc; 181 struct cgroup_subsys_state *bi_css; 182 #ifdef CONFIG_BLK_DEV_THROTTLING_LOW 183 void *bi_cg_private; 184 struct bio_issue bi_issue; 185 #endif 186 #endif 187 union { 188 #if defined(CONFIG_BLK_DEV_INTEGRITY) 189 struct bio_integrity_payload *bi_integrity; /* data integrity */ 190 #endif 191 }; 192 193 unsigned short bi_vcnt; /* how many bio_vec's */ 194 195 /* 196 * Everything starting with bi_max_vecs will be preserved by bio_reset() 197 */ 198 199 unsigned short bi_max_vecs; /* max bvl_vecs we can hold */ 200 201 atomic_t __bi_cnt; /* pin count */ 202 203 struct bio_vec *bi_io_vec; /* the actual vec list */ 204 205 struct bio_set *bi_pool; 206 207 /* 208 * We can inline a number of vecs at the end of the bio, to avoid 209 * double allocations for a small number of bio_vecs. This member 210 * MUST obviously be kept at the very end of the bio. 211 */ 212 struct bio_vec bi_inline_vecs[0]; 213 };
図を見ながら説明したほうが早いので図を見てください。
ざっくり説明するとブロックとページがマップされているということです。
さらに struct bio の他に struct bio_vec という構造体のリスト、イテレーターオブジェクトである struct bvec_iter がありますね。
では宣言・定義を見てくださいね。
// /usr/src/linux-headers-4.18.16-041816-generic/include/linux/bvec.h 30 struct bio_vec { 31 struct page *bv_page; 32 unsigned int bv_len; 33 unsigned int bv_offset; 34 }; 35 36 struct bvec_iter { 37 sector_t bi_sector; /* device address in 512 byte 38 sectors */ 39 unsigned int bi_size; /* residual I/O count */ 40 41 unsigned int bi_idx; /* current index into bvl_vec */ 42 43 unsigned int bi_done; /* number of bytes completed */ 44 45 unsigned int bi_bvec_done; /* number of bytes completed in 46 current bvec */ 47 };
ブロック I/O は bio_vec の bv_page でページとリンクし bvec_iter の bi_idx がイテレーター・添字として機能するような感じですかね。
まあ詳しくは bvec.h のソースを見てください。
Copyright 2018-2019, by Masaki Komatsu