Skip to content

Commit

Permalink
memory: memory notifier error injection module
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mita authored and torvalds committed Jul 31, 2012
1 parent 048b9c3 commit 9579f5b
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 0 deletions.
23 changes: 23 additions & 0 deletions lib/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -1143,6 +1143,29 @@ config PM_NOTIFIER_ERROR_INJECT

If unsure, say N.

config MEMORY_NOTIFIER_ERROR_INJECT
tristate "Memory hotplug notifier error injection module"
depends on MEMORY_HOTPLUG_SPARSE && NOTIFIER_ERROR_INJECTION
help
This option 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

To compile this code as a module, choose M here: the module will
be called pSeries-reconfig-notifier-error-inject.

If unsure, say N.

config FAULT_INJECTION
bool "Fault-injection framework"
depends on DEBUG_KERNEL
Expand Down
1 change: 1 addition & 0 deletions lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o
obj-$(CONFIG_NOTIFIER_ERROR_INJECTION) += notifier-error-inject.o
obj-$(CONFIG_CPU_NOTIFIER_ERROR_INJECT) += cpu-notifier-error-inject.o
obj-$(CONFIG_PM_NOTIFIER_ERROR_INJECT) += pm-notifier-error-inject.o
obj-$(CONFIG_MEMORY_NOTIFIER_ERROR_INJECT) += memory-notifier-error-inject.o

lib-$(CONFIG_GENERIC_BUG) += bug.o

Expand Down
48 changes: 48 additions & 0 deletions lib/memory-notifier-error-inject.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/memory.h>

#include "notifier-error-inject.h"

static int priority;
module_param(priority, int, 0);
MODULE_PARM_DESC(priority, "specify memory notifier priority");

static struct notifier_err_inject memory_notifier_err_inject = {
.actions = {
{ NOTIFIER_ERR_INJECT_ACTION(MEM_GOING_ONLINE) },
{ NOTIFIER_ERR_INJECT_ACTION(MEM_GOING_OFFLINE) },
{}
}
};

static struct dentry *dir;

static int err_inject_init(void)
{
int err;

dir = notifier_err_inject_init("memory", notifier_err_inject_dir,
&memory_notifier_err_inject, priority);
if (IS_ERR(dir))
return PTR_ERR(dir);

err = register_memory_notifier(&memory_notifier_err_inject.nb);
if (err)
debugfs_remove_recursive(dir);

return err;
}

static void err_inject_exit(void)
{
unregister_memory_notifier(&memory_notifier_err_inject.nb);
debugfs_remove_recursive(dir);
}

module_init(err_inject_init);
module_exit(err_inject_exit);

MODULE_DESCRIPTION("memory notifier error injection module");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>");

0 comments on commit 9579f5b

Please sign in to comment.