Commit | Line | Data |
---|---|---|
c9d221f8 | 1 | #include <linux/kernel.h> |
c9d221f8 | 2 | #include <linux/module.h> |
f5a9f52e | 3 | #include <linux/cpu.h> |
c9d221f8 | 4 | |
f5a9f52e | 5 | #include "notifier-error-inject.h" |
c9d221f8 | 6 | |
f5a9f52e | 7 | static int priority; |
c9d221f8 AM |
8 | module_param(priority, int, 0); |
9 | MODULE_PARM_DESC(priority, "specify cpu notifier priority"); | |
10 | ||
8c58898b SAS |
11 | #define UP_PREPARE 0 |
12 | #define UP_PREPARE_FROZEN 0 | |
13 | #define DOWN_PREPARE 0 | |
14 | #define DOWN_PREPARE_FROZEN 0 | |
15 | ||
f5a9f52e AM |
16 | static struct notifier_err_inject cpu_notifier_err_inject = { |
17 | .actions = { | |
8c58898b SAS |
18 | { NOTIFIER_ERR_INJECT_ACTION(UP_PREPARE) }, |
19 | { NOTIFIER_ERR_INJECT_ACTION(UP_PREPARE_FROZEN) }, | |
20 | { NOTIFIER_ERR_INJECT_ACTION(DOWN_PREPARE) }, | |
21 | { NOTIFIER_ERR_INJECT_ACTION(DOWN_PREPARE_FROZEN) }, | |
f5a9f52e | 22 | {} |
c9d221f8 | 23 | } |
c9d221f8 AM |
24 | }; |
25 | ||
8c58898b SAS |
26 | static int notf_err_handle(struct notifier_err_inject_action *action) |
27 | { | |
28 | int ret; | |
29 | ||
30 | ret = action->error; | |
31 | if (ret) | |
32 | pr_info("Injecting error (%d) to %s\n", ret, action->name); | |
33 | return ret; | |
34 | } | |
35 | ||
36 | static int notf_err_inj_up_prepare(unsigned int cpu) | |
37 | { | |
38 | if (!cpuhp_tasks_frozen) | |
39 | return notf_err_handle(&cpu_notifier_err_inject.actions[0]); | |
40 | else | |
41 | return notf_err_handle(&cpu_notifier_err_inject.actions[1]); | |
42 | } | |
43 | ||
44 | static int notf_err_inj_dead(unsigned int cpu) | |
45 | { | |
46 | if (!cpuhp_tasks_frozen) | |
47 | return notf_err_handle(&cpu_notifier_err_inject.actions[2]); | |
48 | else | |
49 | return notf_err_handle(&cpu_notifier_err_inject.actions[3]); | |
50 | } | |
51 | ||
f5a9f52e AM |
52 | static struct dentry *dir; |
53 | ||
c9d221f8 AM |
54 | static int err_inject_init(void) |
55 | { | |
f5a9f52e AM |
56 | int err; |
57 | ||
58 | dir = notifier_err_inject_init("cpu", notifier_err_inject_dir, | |
59 | &cpu_notifier_err_inject, priority); | |
60 | if (IS_ERR(dir)) | |
61 | return PTR_ERR(dir); | |
62 | ||
8c58898b SAS |
63 | err = cpuhp_setup_state_nocalls(CPUHP_NOTF_ERR_INJ_PREPARE, |
64 | "cpu-err-notif:prepare", | |
65 | notf_err_inj_up_prepare, | |
66 | notf_err_inj_dead); | |
f5a9f52e AM |
67 | if (err) |
68 | debugfs_remove_recursive(dir); | |
c9d221f8 | 69 | |
f5a9f52e | 70 | return err; |
c9d221f8 AM |
71 | } |
72 | ||
73 | static void err_inject_exit(void) | |
74 | { | |
8c58898b | 75 | cpuhp_remove_state_nocalls(CPUHP_NOTF_ERR_INJ_PREPARE); |
f5a9f52e | 76 | debugfs_remove_recursive(dir); |
c9d221f8 AM |
77 | } |
78 | ||
79 | module_init(err_inject_init); | |
80 | module_exit(err_inject_exit); | |
81 | ||
82 | MODULE_DESCRIPTION("CPU notifier error injection module"); | |
83 | MODULE_LICENSE("GPL"); | |
84 | MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>"); |