diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2012-07-30 17:43:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-30 20:25:22 -0400 |
commit | 9579f5bd31a04e80a87a7b58bd52dff6dc68bc99 (patch) | |
tree | a574a53f7829f157ef9ce2b696cc66ffe92bcef9 | |
parent | 048b9c3549790af21eabd06a5ebdad305e75b1c5 (diff) |
memory: memory notifier error injection module
This provides the ability to inject artifical errors to memory hotplug
notifier chain callbacks. It is controlled through debugfs interface
under /sys/kernel/debug/notifier-error-inject/memory
If the notifier call chain should be failed with some events notified,
write the error code to "actions/<notifier event>/error".
Example: Inject memory hotplug offline error (-12 == -ENOMEM)
# cd /sys/kernel/debug/notifier-error-inject/memory
# echo -12 > actions/MEM_GOING_OFFLINE/error
# echo offline > /sys/devices/system/memory/memoryXXX/state
bash: echo: write error: Cannot allocate memory
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Greg KH <greg@kroah.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Michael Ellerman <michael@ellerman.id.au>
Cc: Dave Jones <davej@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | lib/Kconfig.debug | 23 | ||||
-rw-r--r-- | lib/Makefile | 1 | ||||
-rw-r--r-- | lib/memory-notifier-error-inject.c | 48 |
3 files changed, 72 insertions, 0 deletions
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index c2024d86fb12..35cfd9eef0e0 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -1143,6 +1143,29 @@ config PM_NOTIFIER_ERROR_INJECT | |||
1143 | 1143 | ||
1144 | If unsure, say N. | 1144 | If unsure, say N. |
1145 | 1145 | ||
1146 | config MEMORY_NOTIFIER_ERROR_INJECT | ||
1147 | tristate "Memory hotplug notifier error injection module" | ||
1148 | depends on MEMORY_HOTPLUG_SPARSE && NOTIFIER_ERROR_INJECTION | ||
1149 | help | ||
1150 | This option provides the ability to inject artifical errors to | ||
1151 | memory hotplug notifier chain callbacks. It is controlled through | ||
1152 | debugfs interface under /sys/kernel/debug/notifier-error-inject/memory | ||
1153 | |||
1154 | If the notifier call chain should be failed with some events | ||
1155 | notified, write the error code to "actions/<notifier event>/error". | ||
1156 | |||
1157 | Example: Inject memory hotplug offline error (-12 == -ENOMEM) | ||
1158 | |||
1159 | # cd /sys/kernel/debug/notifier-error-inject/memory | ||
1160 | # echo -12 > actions/MEM_GOING_OFFLINE/error | ||
1161 | # echo offline > /sys/devices/system/memory/memoryXXX/state | ||
1162 | bash: echo: write error: Cannot allocate memory | ||
1163 | |||
1164 | To compile this code as a module, choose M here: the module will | ||
1165 | be called pSeries-reconfig-notifier-error-inject. | ||
1166 | |||
1167 | If unsure, say N. | ||
1168 | |||
1146 | config FAULT_INJECTION | 1169 | config FAULT_INJECTION |
1147 | bool "Fault-injection framework" | 1170 | bool "Fault-injection framework" |
1148 | depends on DEBUG_KERNEL | 1171 | depends on DEBUG_KERNEL |
diff --git a/lib/Makefile b/lib/Makefile index c32c66473ba1..c34719337d26 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -93,6 +93,7 @@ obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o | |||
93 | obj-$(CONFIG_NOTIFIER_ERROR_INJECTION) += notifier-error-inject.o | 93 | obj-$(CONFIG_NOTIFIER_ERROR_INJECTION) += notifier-error-inject.o |
94 | obj-$(CONFIG_CPU_NOTIFIER_ERROR_INJECT) += cpu-notifier-error-inject.o | 94 | obj-$(CONFIG_CPU_NOTIFIER_ERROR_INJECT) += cpu-notifier-error-inject.o |
95 | obj-$(CONFIG_PM_NOTIFIER_ERROR_INJECT) += pm-notifier-error-inject.o | 95 | obj-$(CONFIG_PM_NOTIFIER_ERROR_INJECT) += pm-notifier-error-inject.o |
96 | obj-$(CONFIG_MEMORY_NOTIFIER_ERROR_INJECT) += memory-notifier-error-inject.o | ||
96 | 97 | ||
97 | lib-$(CONFIG_GENERIC_BUG) += bug.o | 98 | lib-$(CONFIG_GENERIC_BUG) += bug.o |
98 | 99 | ||
diff --git a/lib/memory-notifier-error-inject.c b/lib/memory-notifier-error-inject.c new file mode 100644 index 000000000000..e6239bf0b0df --- /dev/null +++ b/lib/memory-notifier-error-inject.c | |||
@@ -0,0 +1,48 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | #include <linux/module.h> | ||
3 | #include <linux/memory.h> | ||
4 | |||
5 | #include "notifier-error-inject.h" | ||
6 | |||
7 | static int priority; | ||
8 | module_param(priority, int, 0); | ||
9 | MODULE_PARM_DESC(priority, "specify memory notifier priority"); | ||
10 | |||
11 | static struct notifier_err_inject memory_notifier_err_inject = { | ||
12 | .actions = { | ||
13 | { NOTIFIER_ERR_INJECT_ACTION(MEM_GOING_ONLINE) }, | ||
14 | { NOTIFIER_ERR_INJECT_ACTION(MEM_GOING_OFFLINE) }, | ||
15 | {} | ||
16 | } | ||
17 | }; | ||
18 | |||
19 | static struct dentry *dir; | ||
20 | |||
21 | static int err_inject_init(void) | ||
22 | { | ||
23 | int err; | ||
24 | |||
25 | dir = notifier_err_inject_init("memory", notifier_err_inject_dir, | ||
26 | &memory_notifier_err_inject, priority); | ||
27 | if (IS_ERR(dir)) | ||
28 | return PTR_ERR(dir); | ||
29 | |||
30 | err = register_memory_notifier(&memory_notifier_err_inject.nb); | ||
31 | if (err) | ||
32 | debugfs_remove_recursive(dir); | ||
33 | |||
34 | return err; | ||
35 | } | ||
36 | |||
37 | static void err_inject_exit(void) | ||
38 | { | ||
39 | unregister_memory_notifier(&memory_notifier_err_inject.nb); | ||
40 | debugfs_remove_recursive(dir); | ||
41 | } | ||
42 | |||
43 | module_init(err_inject_init); | ||
44 | module_exit(err_inject_exit); | ||
45 | |||
46 | MODULE_DESCRIPTION("memory notifier error injection module"); | ||
47 | MODULE_LICENSE("GPL"); | ||
48 | MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>"); | ||