12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #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>");
|