Blame view
lib/cpu-notifier-error-inject.c
1.53 KB
c9d221f86 fault-injection: ... |
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#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 ", 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>"); |