[crash分析]Kernel panic - not syncing: Aiee, killing interrupt handler!

公司产品升级后,测试发现下发某个配置失败时会导致系统crash。

crash查看栈显示如下,没有有用信息。

crash> bt
PID: 3348   TASK: ffff880175034e70  CPU: 3   COMMAND: "test.sh"
 #0 [ffff88016c063b38] machine_kexec at ffffffff81059beb
 #1 [ffff88016c063b98] __crash_kexec at ffffffff81105822
 #2 [ffff88016c063c68] panic at ffffffff81680541
 #3 [ffff88016c063ce8] do_exit at ffffffff8108c766
 #4 [ffff88016c063d78] do_group_exit at ffffffff8108c92f
 #5 [ffff88016c063da8] get_signal_to_deliver at ffffffff8109d980
 #6 [ffff88016c063e40] do_signal at ffffffff8102a427
 #7 [ffff88016c063f30] do_notify_resume at ffffffff8102aaef
 #8 [ffff88016c063f50] retint_signal at ffffffff8168effc
    RIP: 00007fe2414599f0  RSP: 00007fff17ea1938  RFLAGS: 00010246
    RAX: 00007fe241e306c0  RBX: 0000000000000016  RCX: 0000000000000000
    RDX: 0000000000000000  RSI: 00007fe2415a67fd  RDI: 00007fe2415a643c
    RBP: 0000000000000000   R8: 0000000000000000   R9: 0000000000000005
    R10: 00007fff17ea1740  R11: 00007fe2414b0910  R12: 0000000000000000
    R13: 0000000000000000  R14: 0000000000000001  R15: 0000000000000000
    ORIG_RAX: ffffffffffffffff  CS: 0033  SS: 002b

查看vmcore-dmesg发现有 scheduling while atomic: test.sh/3348/0x00000400。

[  287.366523] BUG: scheduling while atomic: test.sh/3348/0x00000400
[  287.366525] Modules linked in: lwconn(OE) bridge stp llc sha512_ssse3 sha512_generic intel_powerclamp drbg ansi_cprng coretemp iosf_mbi kvm_intel igb(OE) kvm irqbypass crc32_pclmul iTCO_wdt ghash_clmulni_intel iTCO_vendor_support aesni_intel lrw ipmi_ssif qat_c3xxx gf128mul glue_helper ablk_helper pcspkr intel_qat cryptd i2c_i801 i2c_ismt authenc ipmi_msghandler i2c_algo_bit i2c_core shpchp ip_tables xfs libcrc32c mmc_block ahci libahci crct10dif_pclmul sdhci_pci ixgbe(OE) crct10dif_common sdhci dca crc32c_intel ptp pps_core mmc_core libata fjes dm_mirror dm_region_hash dm_log dm_mod nf_conntrack [last unloaded: lwconn]
[  287.366571] CPU: 3 PID: 3348 Comm: link52.sh Tainted: G           OE  ------------   3.10.0-514.26.2.el7.x86_64 #1
[  287.366573] Hardware name: Default string DTA1161AC4/Default string, BIOS 5.13 (G168-025) 07/08/2020
[  287.366574]  0000000000000000 0000000075a7f477 ffff88016c063ee8 ffffffff81687133
[  287.366578]  ffff88016c063ef8 ffffffff81680dd1 ffff88016c063f58 ffffffff8168c6de
[  287.366581]  ffff880175034e70 ffff88016c063fd8 ffff88016c063fd8 ffff88016c063fd8
[  287.366584] Call Trace:
[  287.366593]  [<ffffffff81687133>] dump_stack+0x19/0x1b
[  287.366596]  [<ffffffff81680dd1>] __schedule_bug+0x4d/0x5b
[  287.366600]  [<ffffffff8168c6de>] __schedule+0x89e/0x990
[  287.366603]  [<ffffffff8168d831>] schedule_user+0x31/0xc0
[  287.366606]  [<ffffffff81697875>] sysret_careful+0x14/0x17

也就是说出现了在中断中调度的情况。preempt_count()为0x00000400。
之前讲过
软中断中我们会 preempt_count()+0x100;
local_bh_disable()会 preempt_count()+0x200;

0x400看起来是 local_bh_disable() 嵌套后的结果。
从log中我们可知每次下发link配置并且失败后,会导致crash。配置下发正常却没有问题。

初步查看link配置处理代码,没有发现异常(大意了)。于是增加debug log,打印preempt_count()。
复现后,查看debug log,发现link配置处理代码执行前是preempt_count()是0x00,嵌套调用 spin_lock_bh(A),spin_lock_bh(B) 后,是0x400,函数异常返回后,preempt_count()依然是0x400。

再仔细查看link配置处理代码,发先正常处理中,会调用 spin_unlock_bh(B),spin_unlock_bh(A)。然后函数返回,一切正常。

但是在异常处理逻辑中,调用了 spin_unlock(B),spin_unlock(A)。lock B和A是释放了,但是中断下半部没有enable,导致函数退出后,进程处在中断下半部disable状态。一旦有调度情况,就会出现scheduling while atomic 错误,导致系统异常。

后记:
当我们发现 scheduling while atomic 后,查看 preempt_count(),根据preempt_count()的值,来分析相关操作中对应的lock/unlock是否不匹配。

ARM下出现"Kernel panic - not syncing: Attempted to kill init!"错误通常是由于内核初始化进程(init进程)异常终止引起的。这个错误可能有以下几个可能的原因: 1. 内核配置问题:检查内核配置是否正确,特别是init进程的相关配置。确保正确地编译和安装了init程序,并将其正确配置为内核启动的第一个进程。如果内核配置错误或未正确加载init进程,可能会导致这个错误。 2. 文件系统问题:如果根文件系统无法正确挂载或损坏,也可能导致这个错误。检查文件系统是否完整且可以正常访问。尝试重新挂载文件系统,或者使用备份的文件系统来排除文件系统问题。 3. 设备驱动问题:某些设备驱动程序可能会导致init进程异常终止,从而引发这个错误。尝试禁用或更新相关设备驱动程序,看看是否可以解决问题。 4. 引导加载程序问题:检查引导加载程序的配置和设置,确保正确加载内核和init程序。如果引导加载程序配置不正确或存在问题,也可能导致这个错误。 5. 硬件故障:在一些情况下,硬件故障(如内存故障)也可能导致这个错误。检查硬件是否正常工作,并排除硬件故障的可能性。 总之,解决这个错误需要仔细排查内核配置、文件系统、设备驱动、引导加载程序和硬件等方面的问题。根据具体情况逐一排除可能的原因,并进行相应的修复和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮沉飘摇

码字不易,打赏随意。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值