1#include <linux/kernel.h> 2#include <linux/cpu.h> 3#include <linux/module.h> 4#include <linux/notifier.h> 5 6static int priority; 7static int cpu_up_prepare_error; 8static int cpu_down_prepare_error; 9 10module_param(priority, int, 0); 11MODULE_PARM_DESC(priority, "specify cpu notifier priority"); 12 13module_param(cpu_up_prepare_error, int, 0644); 14MODULE_PARM_DESC(cpu_up_prepare_error, 15 "specify error code to inject CPU_UP_PREPARE action"); 16 17module_param(cpu_down_prepare_error, int, 0644); 18MODULE_PARM_DESC(cpu_down_prepare_error, 19 "specify error code to inject CPU_DOWN_PREPARE action"); 20 21static int err_inject_cpu_callback(struct notifier_block *nfb, 22 unsigned long action, void *hcpu) 23{ 24 int err = 0; 25 26 switch (action) { 27 case CPU_UP_PREPARE: 28 case CPU_UP_PREPARE_FROZEN: 29 err = cpu_up_prepare_error; 30 break; 31 case CPU_DOWN_PREPARE: 32 case CPU_DOWN_PREPARE_FROZEN: 33 err = cpu_down_prepare_error; 34 break; 35 } 36 if (err) 37 printk(KERN_INFO "Injecting error (%d) at cpu notifier\n", err); 38 39 return notifier_from_errno(err); 40} 41 42static struct notifier_block err_inject_cpu_notifier = { 43 .notifier_call = err_inject_cpu_callback, 44}; 45 46static int err_inject_init(void) 47{ 48 err_inject_cpu_notifier.priority = priority; 49 50 return register_hotcpu_notifier(&err_inject_cpu_notifier); 51} 52 53static void err_inject_exit(void) 54{ 55 unregister_hotcpu_notifier(&err_inject_cpu_notifier); 56} 57 58module_init(err_inject_init); 59module_exit(err_inject_exit); 60 61MODULE_DESCRIPTION("CPU notifier error injection module"); 62MODULE_LICENSE("GPL"); 63MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>"); 64