求助一个诡异的 Linux 内核 bug 调试方向

30 天前
 liyafe1997

小米的高通处理器的手机的 Android 内核,rebase 高通上游源码以后,有一个诡异的 bug: 在开关 CPU 核心时(比如用 Kernel Auditor 手动开关,或者各种调试策略/省电策略导致的核心自动开关),在开启 CPU 核心时,有一定概率内核会卡死(不是每次都会,有一定概率会),没有 panic ,而是进入一种诡异的状态: 安卓端的现象就是,整个屏幕定格卡死,无任何响应,闲置一定时间后会暗屏,但是不会熄屏,插入充电器 LED 灯能亮,说明很多进程还是在正常运行的

如果此时连着 ssh ,开着 dmesg -w ,没有任何有价值的线索,只能正常看到 CPUx online 之类的,然后之后的日志也在正常滚动输出,说明 dmesg 此时也是运行正常的。但是如果尝试按 Ctrl+C ,dmesg 就卡死了,也无法正常退出。也无法连接新的 ssh 会话,如果有一个空的 ssh 会话,也无法启动任何新的进程。 总之现象就是:

  1. dmesg 无线索,无报错
  2. 已经在运行的进程(似乎)可以正常运行,但是无法启动任何新的进程,也无法退出已有进程,不确定是卡在按 Ctrl+C 响应 signal 上,还是子进程尝试退出,回到父进程 join 这个过程上。

最主要的是 dmesg 无任何线索,这个诡异的 bug 该往哪个方向查呢?或者还有什么地方能提供线索? 有没有大佬有什么思路?

1395 次点击
所在节点    Android
4 条回复
Donaldo
22 天前
既然都在正常运行,那肯定不是 kernel panic ,所以考虑一下是不是 system framework 层面的问题? logd 还在运行么?
liyafe1997
22 天前
@Donaldo 你说的 system framework 指的是 Android ?应该没到那个层面的事情。因为开关 CPU 核心是内核/驱动的事情,而且现象也没到 Android 层面,比如一个 echo 或者 ls 都运行不了,看起来就像是内核寄了(虽然不是 panic ,但是看起来像什么东西死锁了)。
Donaldo
22 天前
@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 就说明不是太糟糕的问题。
liyafe1997
21 天前
@Donaldo 感谢指路!回头研究下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1044477

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX