夜雨聆风学习资料网

ARTICLE · 1014455

Linux 6.12 源码深度剖析: do_exit

Linux 6.12 源码深度剖析: do_exit

前阵子排查内核线程卡死,发现个坑:别在内核线程里直接调 do_exit()。

那驱动里有个异步刷盘线程,遇到致命错误,程序员直接写了 do_exit(1) 退出。结果卸载模块时,rmmod 进程直接卡死在 D 状态。

根因就在这。kthread_stop() 会发信号等线程收尾。可线程直接调用 do_exit(),绕过了框架里的收尾逻辑。那个 complete 信号永远等不到,系统就死锁了。

后来又碰上个更憋屈的。数据库服务退出要耗 30 多秒,CPU 一个核心跑满。用 ftrace 一抓,全耗在 io_uring_files_cancel 上。

原来底层块设备驱动有大块 I/O 超时机制。进程退出时,内核只能硬等这些未决请求超时。要是驱动没实现高效的 cancel 回调,这等待根本躲不掉。

现在排查这类退出瓶颈,我直接用 bpftrace 挂个 kprobe 盯 do_exit。耗时卡在哪,一目了然。

原文Linux 6.12 源码深度剖析: do_exit
收录于linux短文
作者提示: 个人观点,仅供参考
四川,52分钟前,

相关学习资料