最近几天,我曾经实现的一个系统在与别人系统叠加使用的过程中出现了问题,问题是严重的数据正确性问题,存储到我的系统上的数据出现了正确性问题,引发的现象非常致命。对于这种问题一个非常棘手的事情是没有一个很好的测试用例能够在短时间内将这个问题重现,很难重现的问题就像一个定时炸弹一样随时在身旁爆炸。经过大家反复查阅代码,大胆假设推断,目前找到了一些问题的根源,在此,想说明一个驱动实现过程中page页使用的问题。
bio传下来的page页尽量不要使用,如果驱动层增加bio的page页引用计数,然后在bio返回之后继续使用page页,那么在有些时候会导致数据的正确性问题。如果产生bio的请求是文件系统,并且这个page页是cache中的一部分,那么数据正确性的问题不存在;如果产生bio的请求是其他设备驱动,那么数据正确性问题将很容易产生。问题的根源在于page页中的ref_cnt只对cache管理算法有效,对于mem_pool之类的算法,这个标志位是透明的,所以会导致上下两层驱动对同一page页进行读写操作,这是导致数据正确性问题的原因。
简单对发现的问题进行了说明,又类似问题的同学不妨考虑一下自己的page页使用是否正确?
文章评论(0条评论)
登录后参与讨论