小米的高通处理器的手机的 Android 内核,rebase 高通上游源码以后,有一个诡异的 bug: 在开关 CPU 核心时(比如用 Kernel Auditor 手动开关,或者各种调试策略/省电策略导致的核心自动开关),在开启 CPU 核心时,有一定概率内核会卡死(不是每次都会,有一定概率会),没有 panic ,而是进入一种诡异的状态: 安卓端的现象就是,整个屏幕定格卡死,无任何响应,闲置一定时间后会暗屏,但是不会熄屏,插入充电器 LED 灯能亮,说明很多进程还是在正常运行的
如果此时连着 ssh ,开着 dmesg -w ,没有任何有价值的线索,只能正常看到 CPUx online 之类的,然后之后的日志也在正常滚动输出,说明 dmesg 此时也是运行正常的。但是如果尝试按 Ctrl+C ,dmesg 就卡死了,也无法正常退出。也无法连接新的 ssh 会话,如果有一个空的 ssh 会话,也无法启动任何新的进程。 总之现象就是:
最主要的是 dmesg 无任何线索,这个诡异的 bug 该往哪个方向查呢?或者还有什么地方能提供线索? 有没有大佬有什么思路?
1
Donaldo 201 天前
既然都在正常运行,那肯定不是 kernel panic ,所以考虑一下是不是 system framework 层面的问题? logd 还在运行么?
|
2
liyafe1997 OP @Donaldo 你说的 system framework 指的是 Android ?应该没到那个层面的事情。因为开关 CPU 核心是内核/驱动的事情,而且现象也没到 Android 层面,比如一个 echo 或者 ls 都运行不了,看起来就像是内核寄了(虽然不是 panic ,但是看起来像什么东西死锁了)。
|
3
Donaldo 201 天前
@liyafe1997 #2 也有道理,不应该是安卓层的问题。另外看你的描述说不是稳定复现,且闲置会暗屏说明至少调节背光的驱动和 timer 还是 ok 的,也就是说部分 kworkers 是没问题的,但涉及到进程相关的操作就会导致(可能的)死锁出现。
几个特点:1. 不稳定复现; 2. 进程的操作会导致 hang 住(像是死锁); 3. 内核没有 panic ,部分 kworkers 在正常工作; 4. 触发的条件式 CPU 核心的开关 linux 内核代码太多了,特别也不知你是什么版本,很难定位到具体涉及到哪几行逻辑。。。只能提供一些思路: 根据我手头上这份一加 9p 骁龙 888 5.4 版本的查阅了一下,启动一个进程,也就是 do_fork->copy_process 的时候,第一次绑定 cpu 会默认绑定到 cpu0 上,然后在 wake_up_new_task 里面,会再找一个新的 cpu 调度,会不会是这里或者类似的地方出现了问题,比如你关的核心又被调度了,而恰好没有做好处理,导致了死锁什么的?可以在这些地方试着 printk 一下,毕竟你的 dmesg 还是可以吐日志的。 或者 diff 一下你 rebase 之前之后的仓库,如果太多的话,着重看看 kernel/sched/core.c, kernel/fork.c 等相关文件,看看做了什么改动?没 panic 就说明不是太糟糕的问题。 |
4
liyafe1997 OP @Donaldo 感谢指路!回头研究下
|