- 论坛徽章:
- 0
|
本帖最后由 tacoe 于 2011-12-12 19:53 编辑
如果可以将多个bvec组织到一个sg 段里描述。一个sg里指向一个page.一般一个page 的大小为4096
131 bvprv = NULL;
132 sg = NULL;
133 rq_for_each_segment(bvec, rq, iter) {
134 int nbytes = bvec->bv_len;
135
136 if (bvprv && cluster) {
137 if (sg->length + nbytes > queue_max_segment_size(q)) --〉没有超出物理上限制的段大小,queue_max_segment_size(q)这个值的默认值为65536.
138 goto new_segment;
139
140 if (!BIOVEC_PHYS_MERGEABLE(bvprv, bvec)) --〉物理扇区上连续
141 goto new_segment;
142 if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bvec)) --〉b=no boundary
143 goto new_segment;
144
145 sg->length += nbytes; --〉 直接把增加它的长度。
146 } else {
147 new_segment:
上面蓝色中是不是还缺少一个限制条件:
if (sg->length+nbytes > 4096)
goto new_segment;
PS.这里实现得很优美。 |
|