1.1 触发死锁
echo 7 > /proc/sys/kernel/printk
insmod spin_lock_deadlock.ko
#include <linux/module.h>
#include <linux/kernel.h>
static spinlock_t hack_spinA;
static spinlock_t 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);
spin_lock(&hack_spinA);
}
static int __init lockdep_test_init(void)
{
printk("al: lockdep error test init\n");
spin_lock_init(&hack_spinA);
spin_lock_init(&hack_spinB);
hack_spinAB();
hack_spinBA();
return 0;
}
module_init(lockdep_test_init);
KVERSION := $(shell uname -r)
KERN_DIR := xx/kernel/linux/linux-4.19.125
#CROSS_COMPILE ?= aarch64-linux-gnu-
CROSS_COMPILE ?= arm-linux-gnueabi-
all:
make ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERN_DIR) M=$(shell pwd) modules
rm -f *.mod* *.symvers *.order *.o
clean:
make -C $(KERN_DIR) M=$(shell pwd) clean
obj-m := spin_lock_deadlock.o
1.2 死锁现象
1.3 死锁检测
配置lockdep
CONFIG_DEBUG_RT_MUTEXES=y
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y
CONFIG_DEBUG_LOCK_ALLOC=y
CONFIG_PROVE_LOCKING=y
CONFIG_LOCKDEP=y
CONFIG_LOCK_STAT=y。
CONFIG_DEBUG_LOCKDEP=y
CONFIG_DEBUG_ATOMIC_SLEEP=y
1.4死锁现象