我有一个字符设备驱动程序,该驱动程序正在导致系统僵局在多核心系统上。写入呼叫的关键部分受旋转锁(Spin_lock_irqsave)保护。ISR也必须获得此锁才能完成其任务。如果在写入执行另一个核心部分时,将ISR调用在一个核心上,则由于看门机计时器检测到ISR的核心上的硬锁定而发生恐慌。写过程永远不会返回以完成执行。写作过程是否不应该继续在其核心上执行,释放锁定的锁定,该锁会允许其ISR中的另一个核心运行?
关键部分需要大约5US才能完成。硬锁发生在5秒后。
我认为我做错了什么,但不知道。
感谢任何帮助!
事实证明,关键部分正在调用wait_for_completion_timeout。即使超时为零,如果中断发生在阻塞部分中的中断,它仍然睡着了,也没有醒来释放旋转锁。在这种情况下,使用try_wait_for_completion解决了问题。
我会发布源头,但它涵盖了许多模块,并且在操作系统之间具有可移植性的架构抽象。本来是一团糟。