watchdog: BUG: soft lockup - CPU#3 stuck for 23s! [swapper/0:1]

测试代码 如下:

cpp 复制代码
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

static DEFINE_SPINLOCK(hack_spinA);
static DEFINE_SPINLOCK(hack_spinB);

void hack_spinAB(void)
{
    printk("hack_lockdep:A->B\n");
    spin_lock(&hack_spinA);
    spin_lock(&hack_spinB);
}

void hack_spinBA(void)
{
    printk("hack_lockdep:B->A\n");
    spin_lock(&hack_spinB);
}

static int __init lockdep_test_init(void)
{
    printk("figo:my lockdep module init\n");
    
    hack_spinAB();
    hack_spinBA();
     
    return 0;
}
    
    static void __exit lockdep_test_exit(void)
    {
      printk("goodbye\n");
    }
    
    module_init(lockdep_test_init);
    module_exit(lockdep_test_exit);
    MODULE_LICENSE("GPL");

28.015539\] -(3)\[1:swapper/0-\>0:swapper/0\]watchdog: BUG: soft lockup - CPU#3 stuck for 23s! \[swapper/0:1

28.025300 -(3)1:swapper/0-\>0:swapper/0Kernel panic - not syncing: softlockup: hung tasks

28.033776 -(3)1:swapper/0-\>0:swapper/0CPU: 3 PID: 1 Comm: swapper/0 Tainted: G L 4.19.176 #2

28.043906 -(3)1:swapper/0-\>0:swapper/0Hardware name: Platfrom(DT)

28.050636 -(3)1:swapper/0-\>0:swapper/0Call trace:

28.055711 -(3)1:swapper/0-\>0:swapper/0 dump_backtrace+0x0/0x198

28.062006 -(3)1:swapper/0-\>0:swapper/0 show_stack+0x20/0x2c

28.067951 -(3)1:swapper/0-\>0:swapper/0 dump_stack+0xd8/0x128

28.073984 -(3)1:swapper/0-\>0:swapper/0 panic+0x134/0x334

28.079669 -(3)1:swapper/0-\>0:swapper/0 softlockup_fn+0x0/0x60

28.085790 -(3)1:swapper/0-\>0:swapper/0 __run_hrtimer+0xa8/0x2b0

28.092085 -(3)1:swapper/0-\>0:swapper/0 hrtimer_interrupt+0x174/0x3c8

28.098817 -(3)1:swapper/0-\>0:swapper/0 arch_timer_handler_phys+0x40/0x50

28.105897 -(3)1:swapper/0-\>0:swapper/0 handle_percpu_devid_irq+0x88/0x278

28.113065 -(3)1:swapper/0-\>0:swapper/0 __handle_domain_irq+0x84/0xc4

28.119796 -(3)1:swapper/0-\>0:swapper/0 gic_handle_irq+0x10c/0x184

28.126265 -(3)1:swapper/0-\>0:swapper/0 el1_irq+0xec/0x198

28.132035 -(3)1:swapper/0-\>0:swapper/0 queued_spin_lock_slowpath+0x94/0x270

28.139376 -(3)1:swapper/0-\>0:swapper/0 _raw_spin_lock+0x50/0x54

28.145670 -(3)1:swapper/0-\>0:swapper/0 lockdep_test_init+0x34/0x40

28.152226 -(3)1:swapper/0-\>0:swapper/0 do_one_initcall+0xa0/0x298

28.158694 -(3)1:swapper/0-\>0:swapper/0 do_initcall_level+0xc0/0x164

28.165337 -(3)1:swapper/0-\>0:swapper/0 do_basic_setup+0x34/0x4c

28.171631 -(3)1:swapper/0-\>0:swapper/0 kernel_init_freeable+0xd0/0x150

28.178535 -(3)1:swapper/0-\>0:swapper/0 kernel_init+0x18/0x29c

28.184655 -(3)1:swapper/0-\>0:swapper/0 ret_from_fork+0x10/0x18

28.190864 -(3)1:swapper/0-\>0:swapper/0SMP: stopping secondary CPUs

28.197425 -(3)1:swapper/0-\>0:swapper/0Kernel Offset: disabled

28.203545 -(3)1:swapper/0-\>0:swapper/0CPU features: 0x00000000,22002a38

28.210537 -(3)1:swapper/0-\>0:swapper/0Memory Limit: none

28.216221 -(3)1:swapper/0-\>0:swapper/0eskdump die

28.221295 -(3)1:swapper/0-\>0:swapper/0CPU: 3 PID: 1 Comm: swapper/0 Tainted: G L 4.19.176 #2

28.231425 -(3)1:swapper/0-\>0:swapper/0Hardware name: ES (DT)

28.238156 -(3)1:swapper/0-\>0:swapper/0pstate: 60000089 (nZCv daIf -PAN -UAO)

28.245584 -(3)1:swapper/0-\>0:swapper/0pc : panic+0x1b8/0x334

28.251617 -(3)1:swapper/0-\>0:swapper/0lr : panic+0x148/0x334

28.257649 -(3)1:swapper/0-\>0:swapper/0sp : ffff00000801bbe0

28.263592 -(3)1:swapper/0-\>0:swapper/0x29: ffff00000801bd80 x28: 0000000000000001

28.271543 -(3)1:swapper/0-\>0:swapper/0x27: ffff80037ff9d180 x26: 0000000685682d4d

28.279494 -(3)1:swapper/0-\>0:swapper/0x25: ffff00000a4fd000 x24: 0000000000000003

28.287445 -(3)1:swapper/0-\>0:swapper/0x23: ffff00000a0208b0 x22: 0000000000000000

28.295396 -(3)1:swapper/0-\>0:swapper/0x21: ffff800379219ec0 x20: 0000000000000000

28.303346 -(3)1:swapper/0-\>0:swapper/0x19: ffff000009af821d x18: 0000000000000001

28.311297 -(3)1:swapper/0-\>0:swapper/0x17: 00000000000cc70c x16: 00000000000000f4

28.319248 -(3)1:swapper/0-\>0:swapper/0x15: ffff00000923f160 x14: ffff00000980e250

28.327199 -(3)1:swapper/0-\>0:swapper/0x13: 000000000000369a x12: 0000000029aaaaab

28.335150 -(3)1:swapper/0-\>0:swapper/0x11: 0000000000000001 x10: 0000000006666998

28.343100 -(3)1:swapper/0-\>0:swapper/0x9 : 4b602900c22d1900 x8 : ffff00000801bc20

28.351051 -(3)1:swapper/0-\>0:swapper/0x7 : 73203a504d535d30 x6 : ffff00000a8b5b16

28.359002 -(3)1:swapper/0-\>0:swapper/0x5 : 0000000000000001 x4 : 000000000000000c

28.366953 -(3)1:swapper/0-\>0:swapper/0x3 : 000000000000004a x2 : 0000000000000003

28.374903 -(3)1:swapper/0-\>0:swapper/0x1 : 0000000000000004 x0 : 0000000000000001

28.382854 -(3)1:swapper/0-\>0:swapper/0Modules linked in:

28.397593 -(3)1:swapper/0-\>0:swapper/0done available data size 0x83000

28.404503 -(3)1:swapper/0-\>0:swapper/0kdump_sign sig 0x8a6acdb4, size 0x83000

28.412017 -(3)1:swapper/0-\>0:swapper/0rebooting...
这里没有在kernel 添加lockdep配置,打印的calltrace信息,测试代码逻辑比较简单,所以能一眼看出来lockdep_test_init中有问题

Linux内核中打开lockdep功能,需要打开CONFIG_DEBUG_LOCKDEP选项:

cpp 复制代码
CONFIG_LOCK_STAT=y
CONFIG_PROVE_LOCKING=y
CONFIG_DEBUG_LOCKDEP=y
cpp 复制代码
console:/ # insmod ./lockdep_test.ko
[  501.016783] -(3)[2844:insmod->2519:sh]
[  501.020560] -(3)[2844:insmod->2519:sh]============================================
[  501.028164] -(3)[2844:insmod->2519:sh]WARNING: possible recursive locking detected
[  501.035768] -(3)[2844:insmod->2519:sh]4.19.176 #1 Tainted: G           O
[  501.042935] -(3)[2844:insmod->2519:sh]--------------------------------------------
[  501.050538] -(3)[2844:insmod->2519:sh]insmod/2844 is trying to acquire lock:
[  501.057617] 00000000f287eb44 (hack_spinB){+.+.}, at: init_module+0x34/0xfb0 [lockdep_test]
[  501.065931] -(3)[2844:insmod->2519:sh]
[  501.065931] but task is already holding lock:
[  501.074056] 00000000f287eb44 (hack_spinB){+.+.}, at: hack_spinAB+0x30/0x38 [lockdep_test]
[  501.082275] -(3)[2844:insmod->2519:sh]
[  501.082275] other info that might help us debug this:
[  501.091100] -(3)[2844:insmod->2519:sh] Possible unsafe locking scenario:
[  501.091100]
[  501.099313] -(3)[2844:insmod->2519:sh]       CPU0
[  501.104038] -(3)[2844:insmod->2519:sh]       ----
[  501.108761] -(3)[2844:insmod->2519:sh]  lock(hack_spinB);
[  501.114184] -(3)[2844:insmod->2519:sh]  lock(hack_spinB);
[  501.119608] -(3)[2844:insmod->2519:sh]
[  501.119608]  *** DEADLOCK ***
[  501.119608]
[  501.127823] -(3)[2844:insmod->2519:sh] May be due to missing lock nesting notation
[  501.127823]
[  501.136908] -(3)[2844:insmod->2519:sh]2 locks held by insmod/2844:
[  501.143114] -(3)[2844:insmod->2519:sh] #0: 000000000721ea50 (hack_spinA){+.+.}, at: hack_spinAB+0x24/0x38 [lockdep_test]
[  501.154035] -(3)[2844:insmod->2519:sh] #1: 00000000f287eb44 (hack_spinB){+.+.}, at: hack_spinAB+0x30/0x38 [lockdep_test]
[  501.164958] -(3)[2844:insmod->2519:sh]
[  501.164958] stack backtrace:
[  501.171605] -(3)[2844:insmod->2519:sh]CPU: 3 PID: 2844 Comm: insmod Tainted: G           O      4.19.176 #1
[  501.181388] -(3)[2844:insmod->2519:sh]Hardware name: ESWIN_LD60 (DT)
[  501.187770] -(3)[2844:insmod->2519:sh]Call trace:
[  501.192500] -(3)[2844:insmod->2519:sh] dump_backtrace+0x0/0x198
[  501.198445] -(3)[2844:insmod->2519:sh] show_stack+0x20/0x2c
[  501.204045] -(3)[2844:insmod->2519:sh] dump_stack+0xd8/0x128
[  501.209732] -(3)[2844:insmod->2519:sh] __lock_acquire+0x17d8/0x1ed0
[  501.216028] -(3)[2844:insmod->2519:sh] lock_acquire+0x12c/0x1f4
[  501.221976] -(3)[2844:insmod->2519:sh] _raw_spin_lock+0x54/0x90
[  501.227922] -(3)[2844:insmod->2519:sh] init_module+0x34/0xfb0 [lockdep_test]
[  501.235003] -(3)[2844:insmod->2519:sh] do_one_initcall+0x13c/0x3e0
[  501.241213] -(3)[2844:insmod->2519:sh] do_init_module+0x5c/0x218
[  501.247248] -(3)[2844:insmod->2519:sh] load_module+0x296c/0x31d4
[  501.253283] -(3)[2844:insmod->2519:sh] __se_sys_finit_module+0xd8/0x114
[  501.259928] -(3)[2844:insmod->2519:sh] __arm64_sys_finit_module+0x20/0x2c
[  501.266748] -(3)[2844:insmod->2519:sh] el0_svc_common+0xa0/0x170
[  501.272782] -(3)[2844:insmod->2519:sh] el0_svc_compat_handler+0x28/0x34
[  501.279425] -(3)[2844:insmod->2519:sh] el0_svc_compat+0x8/0x34
相关推荐
剑神一笑1 小时前
Linux pgrep 命令详解:按名称查找进程 PID 的高效方法
linux·运维·chrome
剑神一笑1 小时前
Linux killall 命令详解:按进程名批量终止进程的原理与实践
linux·运维·chrome
日取其半万世不竭6 小时前
iftop、nethogs 和 nload:Linux 服务器网络流量实时监控工具介绍
linux·运维·服务器
mounter6256 小时前
Linux 内核资源管理:控制组(cgroup)的演进与“策略组”新提案
linux·运维·服务器·cgroup·kernel
bksczm6 小时前
文件在磁盘中的存储方式
linux·运维·服务器
L1624766 小时前
OpenSSH 半自动升级方案(独立编译 + 手动迁移 + 重建 systemd 服务)
linux·服务器·ssh
半旧夜夏6 小时前
【保姆级】微服务组件环境搭建(Docker Compose版)
java·linux·spring cloud·微服务·云原生·容器
爱莉希雅&&&7 小时前
zabbix快速搭建和使用
android·linux·数据库·zabbix·监控
z200509307 小时前
【linux学习】深入理解linux文件I/O,从C标准库到内核态
linux·学习·操作系统
weixin_307779138 小时前
面向高性能保密计算的定制 Linux 系统构建与自动部署方案
linux·安全·网络安全·性能优化·系统安全