免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5049 | 回复: 2
打印 上一主题 下一主题

blk_rq_map_sg 这个函数的疑问。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-12 19:51 |只看该作者 |倒序浏览
本帖最后由 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.这里实现得很优美。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
2 [报告]
发表于 2011-12-13 13:30 |只看该作者
回复 1# tacoe

993 static inline unsigned int queue_max_segment_size(struct request_queue *q)
994 {
995         return q->limits.max_segment_size;
996 }

没必要,这里是要放到request_queue 里,不是放到一个page里;只有大小收集到超过q->limits.max_segment_size才转入一个新的segment

论坛徽章:
0
3 [报告]
发表于 2011-12-13 18:54 |只看该作者
回复 2# linuxfellow


原来是我搞错了,
if (!BIOVEC_PHYS_MERGEABLE(bvprv, bvec))  --〉物理扇区上连续 
                            ~~~~~~~~~ 这里不是指物理扇区连续而指两个bvec 的page是连续的。
这样才不会越界。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP