mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-04 04:02:26 +00:00
cpu: rewrite cpu-notifier-error-inject module
Rewrite existing cpu-notifier-error-inject module to use debugfs based new framework. This change removes cpu_up_prepare_error and cpu_down_prepare_error module parameters which were used to specify error code to be injected. We could keep these module parameters for backward compatibility by module_param_cb but it seems overkill for this module. This provides the ability to inject artifical errors to CPU notifier chain callbacks. It is controlled through debugfs interface under /sys/kernel/debug/notifier-error-inject/cpu If the notifier call chain should be failed with some events notified, write the error code to "actions/<notifier event>/error". Example1: inject CPU offline error (-1 == -EPERM) # cd /sys/kernel/debug/notifier-error-inject/cpu # echo -1 > actions/CPU_DOWN_PREPARE/error # echo 0 > /sys/devices/system/cpu/cpu1/online bash: echo: write error: Operation not permitted Example2: inject CPU online error (-2 == -ENOENT) # cd /sys/kernel/debug/notifier-error-inject/cpu # echo -2 > actions/CPU_UP_PREPARE/error # echo 1 > /sys/devices/system/cpu/cpu1/online bash: echo: write error: No such file or directory 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>
This commit is contained in:
parent
8d43828814
commit
f5a9f52e2c
@ -1097,10 +1097,22 @@ config NOTIFIER_ERROR_INJECTION
|
|||||||
|
|
||||||
config CPU_NOTIFIER_ERROR_INJECT
|
config CPU_NOTIFIER_ERROR_INJECT
|
||||||
tristate "CPU notifier error injection module"
|
tristate "CPU notifier error injection module"
|
||||||
depends on HOTPLUG_CPU && DEBUG_KERNEL
|
depends on HOTPLUG_CPU && NOTIFIER_ERROR_INJECTION
|
||||||
help
|
help
|
||||||
This option provides a kernel module that can be used to test
|
This option provides a kernel module that can be used to test
|
||||||
the error handling of the cpu notifiers
|
the error handling of the cpu notifiers by injecting artifical
|
||||||
|
errors to CPU notifier chain callbacks. It is controlled through
|
||||||
|
debugfs interface under /sys/kernel/debug/notifier-error-inject/cpu
|
||||||
|
|
||||||
|
If the notifier call chain should be failed with some events
|
||||||
|
notified, write the error code to "actions/<notifier event>/error".
|
||||||
|
|
||||||
|
Example: Inject CPU offline error (-1 == -EPERM)
|
||||||
|
|
||||||
|
# cd /sys/kernel/debug/notifier-error-inject/cpu
|
||||||
|
# echo -1 > actions/CPU_DOWN_PREPARE/error
|
||||||
|
# echo 0 > /sys/devices/system/cpu/cpu1/online
|
||||||
|
bash: echo: write error: Operation not permitted
|
||||||
|
|
||||||
To compile this code as a module, choose M here: the module will
|
To compile this code as a module, choose M here: the module will
|
||||||
be called cpu-notifier-error-inject.
|
be called cpu-notifier-error-inject.
|
||||||
|
@ -1,58 +1,45 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/cpu.h>
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/notifier.h>
|
#include <linux/cpu.h>
|
||||||
|
|
||||||
|
#include "notifier-error-inject.h"
|
||||||
|
|
||||||
static int priority;
|
static int priority;
|
||||||
static int cpu_up_prepare_error;
|
|
||||||
static int cpu_down_prepare_error;
|
|
||||||
|
|
||||||
module_param(priority, int, 0);
|
module_param(priority, int, 0);
|
||||||
MODULE_PARM_DESC(priority, "specify cpu notifier priority");
|
MODULE_PARM_DESC(priority, "specify cpu notifier priority");
|
||||||
|
|
||||||
module_param(cpu_up_prepare_error, int, 0644);
|
static struct notifier_err_inject cpu_notifier_err_inject = {
|
||||||
MODULE_PARM_DESC(cpu_up_prepare_error,
|
.actions = {
|
||||||
"specify error code to inject CPU_UP_PREPARE action");
|
{ NOTIFIER_ERR_INJECT_ACTION(CPU_UP_PREPARE) },
|
||||||
|
{ NOTIFIER_ERR_INJECT_ACTION(CPU_UP_PREPARE_FROZEN) },
|
||||||
module_param(cpu_down_prepare_error, int, 0644);
|
{ NOTIFIER_ERR_INJECT_ACTION(CPU_DOWN_PREPARE) },
|
||||||
MODULE_PARM_DESC(cpu_down_prepare_error,
|
{ NOTIFIER_ERR_INJECT_ACTION(CPU_DOWN_PREPARE_FROZEN) },
|
||||||
"specify error code to inject CPU_DOWN_PREPARE action");
|
{}
|
||||||
|
|
||||||
static int err_inject_cpu_callback(struct notifier_block *nfb,
|
|
||||||
unsigned long action, void *hcpu)
|
|
||||||
{
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
switch (action) {
|
|
||||||
case CPU_UP_PREPARE:
|
|
||||||
case CPU_UP_PREPARE_FROZEN:
|
|
||||||
err = cpu_up_prepare_error;
|
|
||||||
break;
|
|
||||||
case CPU_DOWN_PREPARE:
|
|
||||||
case CPU_DOWN_PREPARE_FROZEN:
|
|
||||||
err = cpu_down_prepare_error;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (err)
|
|
||||||
printk(KERN_INFO "Injecting error (%d) at cpu notifier\n", err);
|
|
||||||
|
|
||||||
return notifier_from_errno(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct notifier_block err_inject_cpu_notifier = {
|
|
||||||
.notifier_call = err_inject_cpu_callback,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct dentry *dir;
|
||||||
|
|
||||||
static int err_inject_init(void)
|
static int err_inject_init(void)
|
||||||
{
|
{
|
||||||
err_inject_cpu_notifier.priority = priority;
|
int err;
|
||||||
|
|
||||||
return register_hotcpu_notifier(&err_inject_cpu_notifier);
|
dir = notifier_err_inject_init("cpu", notifier_err_inject_dir,
|
||||||
|
&cpu_notifier_err_inject, priority);
|
||||||
|
if (IS_ERR(dir))
|
||||||
|
return PTR_ERR(dir);
|
||||||
|
|
||||||
|
err = register_hotcpu_notifier(&cpu_notifier_err_inject.nb);
|
||||||
|
if (err)
|
||||||
|
debugfs_remove_recursive(dir);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void err_inject_exit(void)
|
static void err_inject_exit(void)
|
||||||
{
|
{
|
||||||
unregister_hotcpu_notifier(&err_inject_cpu_notifier);
|
unregister_hotcpu_notifier(&cpu_notifier_err_inject.nb);
|
||||||
|
debugfs_remove_recursive(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(err_inject_init);
|
module_init(err_inject_init);
|
||||||
|
Loading…
Reference in New Issue
Block a user