我正在处理 i2c-omap 驱动程序的一个奇怪问题。我不确定问题是否发生在其他时间,但它发生在我尝试关闭系统电源的时间大约为 5%。在系统断电期间,我通过 I2C 写入 PMIC 中的一些寄存器。在 i2c-omap.c 中,我可以看到调用线程正在等待 wait_for_completion_timeout,超时值设置为 1 秒。我可以看到名为“完成”的 IRQ(我在“完成”之后添加了 printk)。但是,在调用“完成”之后,wait_for_completion_timeout 没有返回。相反,它最多需要 5 分钟才能返回。而wait_for_completion_timeout的返回值为正表示没有超时。并且整个I2C交易是成功的。
同时,我可以看到来自其他驱动程序的 printk 消息。串行控制台仍然有效。它在 Android 上,如果我使用“top”,我可以看到 system_server 占用了大约 95% 的 CPU。杀死 system_server 可以使 wait_for_completion_timeout 立即返回。
所以我的问题是用户空间应用程序(system_server)可以做什么来使内核“wait_for_completion_timeout”不被唤醒?
谢谢!