gpt4 book ai didi

android - Linux 内核 wait_for_completion_timeout 未被完成唤醒

转载 作者:行者123 更新时间:2023-11-29 00:34:20 29 4
gpt4 key购买 nike

我正在处理 i2c-omap 驱动程序的一个奇怪问题。我不确定问题是否发生在其他时间,但它发生在我尝试关闭系统电源的大约 5% 的时间。在系统断电期间,我通过 I2C 写入 PMIC 中的一些寄存器。在 i2c-omap.c 中,我可以看到调用线程正在等待 wait_for_completion_timeout,超时值设置为 1 秒。我可以看到名为“完成”的 IRQ(我在“完成”之后添加了 printk)。但是,在调用“complete”之后,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”不被唤醒?

谢谢!

最佳答案

wait_for_completion_timeout 仅保证在 (i) 完成发生或 (ii) 超时到期时等待条件的线程将变为“可运行”。
之后,调度程序的工作就是调度该线程并将其状态从“可运行”更改为“正在运行”。线程本身(或完成框架)不负责使线程可运行,这是调度程序的工作。
正如您所指出的,system_server 消耗了 95% 的 cpu,因此很难安排完成线程。这就解释了为什么线程没有得到调度。

关于android - Linux 内核 wait_for_completion_timeout 未被完成唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13503888/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com