默认环境:
1 2 3 4
   | [root@localhost ~]# sysctl kernel.softlockup_panic kernel.hardlockup_panic kernel.softlockup_panic = 0 kernel.hardlockup_panic = 1 [root@localhost ~]#
 
  | 
模拟 单CPU Lockup
Soft Lockup
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
   | [root@localhost soft]# cat hog.c #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/kthread.h>
  MODULE_LICENSE("GPL");
  static int hog_thread(void *data) {     DEFINE_SPINLOCK(lock);
      printk(KERN_INFO "Soft Lockup Hogging on CPU %d now\n", get_cpu());     spin_lock(&lock);
      while (1);
      /* unreached */     return 0; }
  static int __init hog_init(void) {     kthread_run(hog_thread, NULL, "hog");     return 0; }
  static void __exit hog_exit(void) {     printk(KERN_INFO "Hogging exit\n");     return; }
 
  module_init(hog_init); module_exit(hog_exit); [root@localhost soft]#
 
  | 
 
Hard Lockup
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   | [root@localhost hard]# cat hog.c #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/kthread.h> #include <linux/spinlock.h>
  MODULE_LICENSE("GPL");
  static int hog_thread(void *data) {     DEFINE_SPINLOCK(lock);
      printk(KERN_INFO "Hard lockup Hogging a CPU %d now\n", get_cpu());     spin_lock_irq(&lock);     while (1);
      /* unreached */     return 0; }
  static int __init hog_init(void) {     kthread_run(hog_thread, NULL, "hog");     return 0; }
  static void __exit hog_exit(void) {     printk(KERN_INFO "Hogging exit\n");     return; }
 
  module_init(hog_init); module_exit(hog_exit);
 
  | 
 
模拟 所有CPU Lockup
Soft lockup
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
   | [root@localhost soft]# cat hog.c #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/kthread.h>
  MODULE_LICENSE("GPL");
  static int hog_thread(void *data) {     DEFINE_SPINLOCK(lock);
      printk(KERN_INFO "Soft Lockup Hogging on CPU %d now\n", get_cpu());     spin_lock(&lock);
      while (1);
      /* unreached */     return 0; }
  static int __init hog_init(void) {     int cpu = 0;     for_each_online_cpu(cpu)     {         struct task_struct *task = kthread_create(hog_thread, NULL, "hog");         kthread_bind(task, cpu);         wake_up_process(task);     }
      return 0; }
  static void __exit hog_exit(void) {     printk(KERN_INFO "Hogging exit\n");     return; }
 
  module_init(hog_init); module_exit(hog_exit); [root@localhost soft]#
 
  | 
 
Hard Lockup
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
   | [root@localhost hard]# cat hog.c #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/kthread.h> #include <linux/spinlock.h>
  MODULE_LICENSE("GPL");
  static int hog_thread(void *data) {     DEFINE_SPINLOCK(lock);
      printk(KERN_INFO "Hard lockup Hogging a CPU %d now\n", get_cpu());     spin_lock_irq(&lock);     while (1);
      /* unreached */     return 0; }
  static int __init hog_init(void) {     int cpu = 0;     for_each_online_cpu(cpu)     {         struct task_struct *task = kthread_create(hog_thread, NULL, "hog");         kthread_bind(task, cpu);         wake_up_process(task);     }
      return 0; }
  static void __exit hog_exit(void) {     printk(KERN_INFO "Hogging exit\n");     return; }
 
  module_init(hog_init); module_exit(hog_exit);
 
  | 
 
Makefile
1 2 3 4 5 6 7 8
   | [root@localhost hard]# cat Makefile obj-m += hog.o
  all:     make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules clean:     make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean [root@localhost hard]#
 
  | 
 
死锁时  内核崩溃转储
1 2 3 4 5 6 7 8
   | [root@localhost ~]# vim /etc/sysctl.conf [root@localhost hard]# sysctl -p kernel.softlockup_all_cpu_backtrace = 1 kernel.hardlockup_all_cpu_backtrace = 1 kernel.softlockup_panic = 1 kernel.hardlockup_panic = 1 kernel.nmi_watchdog = 1 [root@localhost hard]#
 
  |