和同事分析了出现panic的back-trace,在request添加到queue的红黑树发现重复的request并且是empty的。这有可能是之前的rb-node被clear后,没有rb-erase,使其一直在这段数据区域内保存。暂时还没有完全了解这部分的逻辑,等我仔细研究透彻了再和大家分享。
之前在sd卡热插拔的环境里,也遇到过类似的panic,其运行的逻辑如下:
数据结构区域A被许多外部指针引用,由于sd un-plug使sd驱动的相关数据remove,A区域被kfree.
sd plug-in会重新建立sd卡的驱动,包括申请数据区域A‘,并且将其清零。奇怪的是A A'是同样的cache-object.A被kfree的时候,把这个cache-object放在一个array里,如果数组内的object没有超过limit数值,这些object并不会被真正的free.重新申请相同的kmem_cache时,有可能会从array里取到刚刚free的object,也就是说A = A'。
上面的这部分逻辑也不是很清楚,需要继续研究研究(不是官话,哈哈)
增加“闪断”是和水木前版主ychu聊天时候他提供的方案。好像硬盘热插拔有比较成熟的机制。
和同事一起增加对sd热插拔的延时处理,在mmc_rescan这个work里去检查卡槽是否真正有sd卡,如果卡在当前槽内并且sd卡驱动正在work,不对sd 卡做remove操作,只对sd卡物理初始化,使其恢复到正常工作状态。当然还需要处理当前正在进行的request,比如block or reject它,以防造成数据丢失。目前还有一些warning,需要继续在这个基础上解决--还有许多稳定性的测试要做。
设想后面用sd卡cp一个大文件的过程中(99%),突然拔掉sd卡,只要在delay(2s)的时间内插入卡,并不会造成数据丢失和文件系统的crash.
等把这个事情妥善做好了,和大家一起分享~
阅读(1891) | 评论(0) | 转发(0) |