diff options
| -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>"); | ||
