我有一个字符设备驱动程序,它导致多核系统上的系统死锁。写调用具有受自旋锁(spin_lock_irqsave)保护的临界区。 ISR必须获得此锁以完成其任务。如果在写入正在执行另一个核心的临界区域时在一个核心上调用ISR,则由于看门狗定时器检测到核心上的ISR硬锁定而发生混乱。写入过程永远不会返回完成执行。写入进程是否应该继续在其核心上执行,释放锁定,这将允许其ISR中的其他核心运行?
关键部分需要大约5us才能完成。 5秒后发生硬锁。
我认为我做错了什么但不知道是什么。
感谢任何帮助!
答案 0 :(得分:0)
原来关键部分是调用wait_for_completion_timeout。即使超时为零,它仍然会睡眠并且如果在阻塞部分发生中断,则不会唤醒以释放自旋锁。在这种情况下使用try_wait_for_completion解决了这个问题。
我会发布源代码,但它涵盖了许多模块,并且具有可在操作系统之间移植的架构抽象。会一团糟。