Linux 陷入 CPU 软锁定?

标签 linux linux-kernel centos driver kernel-module

我的系统是 CentOS 6.3(运行内核版本 2.6.32-279.el6.x86_64)。

我有一个可加载的内核模块,它是一个管理 PCIe 卡的驱动程序。 如果我在操作系统启动并运行时使用 insmod 手动插入驱动程序,驱动程序会成功加载并运行。

但是,如果我尝试使用 rpm 安装驱动程序然后重新启动系统,在启动过程中操作系统会卡住并为所有 CPU 内核发出以下“软锁定”消息,除了一个处于“软”状态的内核在我的驱动程序创建的线程之一中锁定”。

BUG: soft lockup - CPU#X stuck for 67s! [migration/8:36]
.......(same above message for all cores except one)
BUG: soft lockup - CPU#10 stuck for 67s! [mydriver_thread/8:36]
(one core is locked up in one of the threads in my driver).

我在网上搜索了很多有关此内核消息/错误的信息,并且有很多关于它的帖子,但没有关于导致它的原因或如何调试的帖子。非常感谢对以下问题的任何帮助:

  1. 我无法登录系统,我认为这是因为所有内核都处于“软锁定”状态,因此无法从 shell 提示符触发内核转储。我启用了 SysRq,并尝试使用 SysRq 组合键触发内核转储,但没有成功。系统似乎没有响应键盘(甚至没有响应 CapsLock 按钮)。关于在这种情况下如何触发内核转储的任何建议?

  2. 我可以想象我的驱动程序线程可能导致“软锁定”。但是“迁移”线程(内核线程)怎么会因为我的驱动程序而处于“软锁定”状态呢?

  3. 在浏览网络时,“迁移”线程用于将任务从一个 CPU 移动到另一个。有人可以帮我理解这个线程到底是做什么的吗?以及它如何受到其他线程的影响(如果有的话)。

最佳答案

我的桌面上有一个非常相似的问题。它会非常频繁地软锁定 - 大约一天一次。

事实证明这是因为我在 Intel Haswell 上运行。 Intel 处理器的 Haswell/Broadwell 系列似乎有一个 bug,会导致系统不稳定。此错误已在微代码更新中修复。

检查 CentOS 是否提供 intel-microcode 软件包,并安装它。确保在加载 initramfs 之前将 grub 配置为将其加载为初始 ramdisk。

就个人而言,我通过启动进入 Windows 并运行 BIOS 更新来升级我的微代码。您可以通过比较更新前后 grep 'microcode'/proc/cpuinfo 的输出来检查 microcode 是否实际更新。

关于Linux 陷入 CPU 软锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15146372/

相关文章:

linux - 是否需要在 del_timer() 之后再次调用 init_timer()

linux - 模拟 netcat -e

centos - 如何将 CentOS 5.11 升级到 6.x

c++ - C++ 和 $! 之间的 PID 一致性bash 中的变量

Linux : NetworkManager's/etc/NetworkManager/dispatcher. d/test 脚本不起作用。包含代码

linux - 如何使用 Linux 调度程序将 CPU 核心限制为仅 2 个应用程序?

c - Linux内核模块编程

c - 内核中[inittest]的优势是什么

perl - 找不到 perl 错误日志

linux - 什么是 centos LiveCD?