Commit 9579f5bd31a04e80a87a7b58bd52dff6dc68bc99

Authored by Akinobu Mita
Committed by Linus Torvalds
1 parent 048b9c3549

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

... ... @@ -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
... ... @@ -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>");