Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Akinobu Mita and committed by
Linus Torvalds
9579f5bd 048b9c35

+72
+23
lib/Kconfig.debug
··· 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
+1
lib/Makefile
··· 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
+48
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>");