Linux陷入CPU软锁定?

Linux陷入CPU软锁定?,linux,linux-kernel,centos,driver,kernel-module,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

我的系统是一个
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).
我在网上搜索了很多关于这个内核msg/bug的信息,有很多关于它的帖子,没有关于它的原因或者如何调试的帖子。如果您对以下问题有任何帮助,我们将不胜感激:

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

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

  • 通过浏览网络,“迁移”线程用于将任务从一个cpu移动到另一个cpu。有人能帮我理解这条线的作用吗?以及它如何受到其他线程的影响(如果有的话)


  • 我的桌面上有一个非常类似的问题。它会经常被软禁——大约每天一次左右

    原来是因为我用的是英特尔Haswell。Haswell/Broadwell系列英特尔处理器似乎存在一个可能导致系统不稳定的缺陷。此错误已在微码更新中修复

    检查CentOS是否提供intel微码软件包,然后安装。确保在grub加载initramfs之前,将其配置为作为初始ramdisk加载


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

    如果您能向我们展示一些堆栈跟踪,那将非常有帮助。重新启动时出现的问题让我想起了在没有固件的情况下模块加载固件时遇到的许多问题。驱动程序是否试图从初始ramdisk加载?它需要固件而没有得到吗?您的驱动程序是否在初始化过程中循环并占用所有工作队列线程或其他内容?@cdleonard屏幕上没有backstrace。对于系统中的16个内核中的每一个,我得到的只是16行相同的内核消息(“BUG:soft lockup…”)。其中一条消息是一个内核正忙于处理来自驱动程序的线程,而内核的其余部分则被迁移线程卡住了。@Zan Lynx驱动程序不是从init ramdisk加载的。它不做任何fw下载,只是编程一个以太网卡。我不相信驱动程序占用了所有的工作队列线程。如果是这样,我在执行ins mod时不会遇到同样的问题。出于好奇,一个驱动程序可以创建多少个工作队列线程(最大数量)。您可以让内核死机(并给您一个回溯),而无需重新编译。我使用的是CentOS 6.4,只需将softlockup_panic=1添加到内核引导行即可实现这一点。