免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2982 | 回复: 7

[内核模块] bio bio_vec page对齐issue [复制链接]

论坛徽章:
0
发表于 2015-08-13 10:04 |显示全部楼层
关于bio_vec的几点疑问, 望解惑, Thanks

struct bio_vec {
    struct   page     *bv_page;
    unsigned int       bv_len;
    unsigned int       bv_offset;      
};

1. 一个bio_vec会跨page吗? bv_len<=PAGE_SIZE ?
2. bv_offset跟什么有关系, 一般情况bv_offset=0?
3. bv_len + bv_offset = PAGE_SIZE ?

举一个例子:
   如果存储盘的硬件扇区是4KB, 现在要读8KB, Block IO Layer 会产生怎样的bio?
     1) 2个同样的bio    .bv_len=4KB    .bv_offset=0
     2)   3个bio    bio1     .bv_len=4KB  .bv_offset=0   |   bio2   bio3   .bv_len=2KB   bv_offset=2KB
     3)   其他各种组合

哪种? 跟什么有关系

因为像现在的NandFlsh的硬件扇区一般是4KB 像case2)中的bio2 bio3不够一个写Unit,这样的bio底层接口感觉没法处理啊? 还是说VFS和BLOCK IO Layer 能保证不会有这种Bio

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
发表于 2015-08-13 21:01 |显示全部楼层
1. 一个bio_vec会跨page吗? bv_len<=PAGE_SIZE ?
一个单独的bio不会超过一个page,但bio可以是矢量方式,算起来这个bio就可以很大了。
2. bv_offset跟什么有关系, 一般情况bv_offset=0?
bio大小是sector的倍数,bv_offset是映射的page内的偏移量。
3. bv_len + bv_offset = PAGE_SIZE ?
不是,bv_offset应该是你能访问数据在page内的起始位置,bv_len是数据长度。

举一个例子:
   如果存储盘的硬件扇区是4KB, 现在要读8KB, Block IO Layer 会产生怎样的bio?
     1) 2个同样的bio    .bv_len=4KB    .bv_offset=0
     2)   3个bio    bio1     .bv_len=4KB  .bv_offset=0   |   bio2   bio3   .bv_len=2KB   bv_offset=2KB
     3)   其他各种组合
bio的大小,看你读写的方式,以及访问数据是否对齐了。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-08-13 21:07 |显示全部楼层
这应该只是一个纯粹的描述性的结构,即当前bio对应page从offset开始的len个字节。

论坛徽章:
0
发表于 2015-08-14 00:12 |显示全部楼层
回复 2# 镇水铁牛

2. bv_offset跟什么有关系, 一般情况bv_offset=0?
bio大小是sector的倍数,bv_offset是映射的page内的偏移量
嗯,那这个bv_offset跟什么有关系,就像我举得那个例子,可能有很多case,
因为这部分是归OS管的,我们没法控制, disk的驱动程序直接接受并处理下来的bio,如果不是PAGE align的话,我的controller DMA方式去取的处理方式会不同

3. bv_len + bv_offset = PAGE_SIZE ?
不是,bv_offset应该是你能访问数据在page内的起始位置,bv_len是数据长度。
这个概念我知道,我的疑问是bv_len的范围? 会不会大于PAGE_SIZE-bv_offset,即会不会跨到相邻的下一个page去

读写方式,对齐? 我是用vdbench和fio这些disk性能测试工具去run的,bs=4K*n,  随机,顺序都会有

Best Regard回复 2# 镇水铁牛


   

论坛徽章:
0
发表于 2015-08-14 00:25 |显示全部楼层
不知道驱动层能不能修改这个bio, 我这个疑问的初衷的是想把bio里的各个不是page align的bio_vec都给挪对齐了,最终驱动处理的bio里的各个bio_vec都是
offset=0 len=4K的
比如一个bio有2个bio_vec,bio_vec1 offset=1K len=3K 另一个bio_vec2 offset=3K len=1K,这俩给merge一下构成一个bio_vec offset=0 len=4K
这样我底层的HW处理就简单了,感觉自己的想法有点扯淡

Best Regards
回复 3# nswcfd


   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-08-19 06:20:002015亚冠之本尤德科
日期:2015-08-31 23:24:47
发表于 2015-08-15 00:59 |显示全部楼层
bvec里面的数据肯定是至少扇区对齐的,比如扇区是512,那么offset和len至少是512对齐的。
如果通用块层生成的一个bio,还要底层驱动来调整offset和len,不能被硬件直接使用,你不觉得这样很荒唐么?
可以看一下我的一篇“块设备剖析之BIO ”的博客,里面有讲offset和len

论坛徽章:
0
发表于 2015-08-15 11:07 |显示全部楼层
是的,如果这样就是OS框架有问题, 分层有耦合就失去了意义, 驱动不能直接override bio 但可以split bio,不过你说的offset是扇区对齐,我printk 这个值,并没有这个restriction, 还需要在看看code
谢谢 regard回复 6# 夕阳下的孤影


   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-08-19 06:20:002015亚冠之本尤德科
日期:2015-08-31 23:24:47
发表于 2015-08-15 12:37 |显示全部楼层
回复 7# xudc14

offset和len必定是扇区对齐的!别忘了,0也是扇区对齐的
当然我们平常遇到的绝大多数情况都是off=0,len=4K,因为文件系统层有缓冲、有预读。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP