#include <linux/kernel.h> #include <linux/cpu.h> #include <linux/module.h> #include <linux/notifier.h> static int priority; static int cpu_up_prepare_error; static int cpu_down_prepare_error; module_param(priority, int, 0); MODULE_PARM_DESC(priority, "specify cpu notifier priority"); module_param(cpu_up_prepare_error, int, 0644); MODULE_PARM_DESC(cpu_up_prepare_error, "specify error code to inject CPU_UP_PREPARE action"); module_param(cpu_down_prepare_error, int, 0644); MODULE_PARM_DESC(cpu_down_prepare_error, "specify error code to inject CPU_DOWN_PREPARE action"); static int err_inject_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { int err = 0; switch (action) { case CPU_UP_PREPARE: case CPU_UP_PREPARE_FROZEN: err = cpu_up_prepare_error; break; case CPU_DOWN_PREPARE: case CPU_DOWN_PREPARE_FROZEN: err = cpu_down_prepare_error; break; } if (err) printk(KERN_INFO "Injecting error (%d) at cpu notifier\n", err); return notifier_from_errno(err); } static struct notifier_block err_inject_cpu_notifier = { .notifier_call = err_inject_cpu_callback, }; static int err_inject_init(void) { err_inject_cpu_notifier.priority = priority; return register_hotcpu_notifier(&err_inject_cpu_notifier); } static void err_inject_exit(void) { unregister_hotcpu_notifier(&err_inject_cpu_notifier); } module_init(err_inject_init); module_exit(err_inject_exit); MODULE_DESCRIPTION("CPU notifier error injection module"); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>");