免费注册 查看新帖 |

Chinaunix

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

内核里同时下发两个bio写到同一磁盘地址的情况分析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-10 12:38 |只看该作者 |倒序浏览
现在有一个内核模块,同时存在多个流程将一个512Bytes的结构体更新到磁盘对应的位置上,如果两个流程更新同一个结构体就会出现两个bio写到同一磁盘地址的情况。
如果先修改结构体的流程形成的bio先写入磁盘中,这样没有问题,但是因为存在io调度,可能造成后修改结构体的流程先写入磁盘,这就出现了问题:磁盘中的结构体与内存中的最新的结构体是不一致的。
测试表明:采用WRITE_BARRIER不会出现这个问题,也就是能很好地保序;但是使用WRITE_SYNC就不行,偶尔会发生不一致的情况。

现在的问题是multipath做出来的分区不支持WRITE_BARRIER,而使用WRITE_SYNC又会出现不一致的情况,请教各位内核达人该如何解决这个问题,多谢多谢。

论坛徽章:
0
2 [报告]
发表于 2011-08-12 14:18 |只看该作者
你是怎么确定,是那个线程先发起写的呢?

如果两个时间相差特别小的话。 我觉得这种还是在上层作同步较好

论坛徽章:
0
3 [报告]
发表于 2011-08-12 17:47 |只看该作者
在__make__request  里做了合并调度算法,
使用BARRIER,不会做bio的调度,每个bio对应到一个request,然后         elevator indicated where it wants this request to be inserted at elevator_merge time,插入到队列中

而不使用BARRIER,是会用电梯调度算法,至于用哪个看你的配置。
但make__request 使用了queue的锁,也就是能保证在队列里调度的先后顺序,难道是调度算法出的问题?

queue是q = bdev_get_queue(bio->bi_bdev);
return bdev->bd_disk->queue;是disk里的queue.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP