Commit 9579f5bd31a04e80a87a7b58bd52dff6dc68bc99
Committed by
Linus Torvalds
1 parent
048b9c3549
Exists in
master
and in
20 other branches
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>
Showing 3 changed files with 72 additions and 0 deletions Side-by-side Diff
lib/Kconfig.debug
... | ... | @@ -1143,6 +1143,29 @@ |
1143 | 1143 | |
1144 | 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 | 1169 | config FAULT_INJECTION |
1147 | 1170 | bool "Fault-injection framework" |
1148 | 1171 | depends on DEBUG_KERNEL |
lib/Makefile
... | ... | @@ -93,6 +93,7 @@ |
93 | 93 | obj-$(CONFIG_NOTIFIER_ERROR_INJECTION) += notifier-error-inject.o |
94 | 94 | obj-$(CONFIG_CPU_NOTIFIER_ERROR_INJECT) += cpu-notifier-error-inject.o |
95 | 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 | 98 | lib-$(CONFIG_GENERIC_BUG) += bug.o |
98 | 99 |
lib/memory-notifier-error-inject.c
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>"); |