最近碰到一个问题,android平台,在执行fsck_msdos时拔卡,出现fsck_msdos进程状态为D。因为卡驱动插拔部分(非MMC那一套)我已经改成如果没有umount就不再进行新一轮的插卡检测,所以这里就不能正常跑了
1. 查看该进程堆栈 cat /proc/pid/stack
看到停在sync_page里的io_schedule。单独看到io_schedule我以为和schedule差不多,往里看并没有设置进程状态为非RUNNING, 所以以为与schedule一样会得到再次调度,实际上io_schedule是需要唤醒的。wait_on_page_bit有将进程状态设置为TASK_UNINTERRUPTIBLE,再调用sync_page。
2. 阻塞在sync_page的io_schedule是因为page状态为lock。每个page操作期间都会上锁,如果此时状态为lock,就是同样的page被另一个进程正在访问,但ps查看所有进程并没有什么进程被阻塞,连底层card_queue_thread也是sleep状态。
3. 结果我花时间把ULK 相关3章看了一遍,还是没头绪,总认为是kernel本身的问题,认为可能是插拔这种非正常状态下导致某些路径未执行unlock_page解锁。花了好长时间在这个上面,加了无数打印看流程
4. 我的打印集中在block_read_full_page,