forked from Minki/linux
02fff96a79
This module allows to insert errors in some of netdevice's notifier events. All network drivers use these notifiers to signal various events and to check if they are allowed, e.g. PRECHANGEMTU and CHANGEMTU afterwards. Until recently I had to run failure tests by injecting a custom module, but now this infrastructure makes it trivial to test these failure paths. Some of the recent bugs I fixed were found using this module. Here's an example: $ cd /sys/kernel/debug/notifier-error-inject/netdev $ echo -22 > actions/NETDEV_CHANGEMTU/error $ ip link set eth0 mtu 1024 RTNETLINK answers: Invalid argument CC: Akinobu Mita <akinobu.mita@gmail.com> CC: "David S. Miller" <davem@davemloft.net> CC: netdev <netdev@vger.kernel.org> Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
124 lines
4.0 KiB
Plaintext
124 lines
4.0 KiB
Plaintext
Notifier error injection
|
|
========================
|
|
|
|
Notifier error injection provides the ability to inject artificial errors to
|
|
specified notifier chain callbacks. It is useful to test the error handling of
|
|
notifier call chain failures which is rarely executed. There are kernel
|
|
modules that can be used to test the following notifiers.
|
|
|
|
* CPU notifier
|
|
* PM notifier
|
|
* Memory hotplug notifier
|
|
* powerpc pSeries reconfig notifier
|
|
* Netdevice notifier
|
|
|
|
CPU notifier error injection module
|
|
-----------------------------------
|
|
This feature can be used to test the error handling of the CPU notifiers by
|
|
injecting artificial errors to CPU notifier chain callbacks.
|
|
|
|
If the notifier call chain should be failed with some events notified, write
|
|
the error code to debugfs interface
|
|
/sys/kernel/debug/notifier-error-inject/cpu/actions/<notifier event>/error
|
|
|
|
Possible CPU notifier events to be failed are:
|
|
|
|
* CPU_UP_PREPARE
|
|
* CPU_UP_PREPARE_FROZEN
|
|
* CPU_DOWN_PREPARE
|
|
* CPU_DOWN_PREPARE_FROZEN
|
|
|
|
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)
|
|
|
|
# echo -2 > actions/CPU_UP_PREPARE/error
|
|
# echo 1 > /sys/devices/system/cpu/cpu1/online
|
|
bash: echo: write error: No such file or directory
|
|
|
|
PM notifier error injection module
|
|
----------------------------------
|
|
This feature is controlled through debugfs interface
|
|
/sys/kernel/debug/notifier-error-inject/pm/actions/<notifier event>/error
|
|
|
|
Possible PM notifier events to be failed are:
|
|
|
|
* PM_HIBERNATION_PREPARE
|
|
* PM_SUSPEND_PREPARE
|
|
* PM_RESTORE_PREPARE
|
|
|
|
Example: Inject PM suspend error (-12 = -ENOMEM)
|
|
|
|
# cd /sys/kernel/debug/notifier-error-inject/pm/
|
|
# echo -12 > actions/PM_SUSPEND_PREPARE/error
|
|
# echo mem > /sys/power/state
|
|
bash: echo: write error: Cannot allocate memory
|
|
|
|
Memory hotplug notifier error injection module
|
|
----------------------------------------------
|
|
This feature is controlled through debugfs interface
|
|
/sys/kernel/debug/notifier-error-inject/memory/actions/<notifier event>/error
|
|
|
|
Possible memory notifier events to be failed are:
|
|
|
|
* MEM_GOING_ONLINE
|
|
* MEM_GOING_OFFLINE
|
|
|
|
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
|
|
|
|
powerpc pSeries reconfig notifier error injection module
|
|
--------------------------------------------------------
|
|
This feature is controlled through debugfs interface
|
|
/sys/kernel/debug/notifier-error-inject/pSeries-reconfig/actions/<notifier event>/error
|
|
|
|
Possible pSeries reconfig notifier events to be failed are:
|
|
|
|
* PSERIES_RECONFIG_ADD
|
|
* PSERIES_RECONFIG_REMOVE
|
|
* PSERIES_DRCONF_MEM_ADD
|
|
* PSERIES_DRCONF_MEM_REMOVE
|
|
|
|
Netdevice notifier error injection module
|
|
----------------------------------------------
|
|
This feature is controlled through debugfs interface
|
|
/sys/kernel/debug/notifier-error-inject/netdev/actions/<notifier event>/error
|
|
|
|
Netdevice notifier events which can be failed are:
|
|
|
|
* NETDEV_REGISTER
|
|
* NETDEV_CHANGEMTU
|
|
* NETDEV_CHANGENAME
|
|
* NETDEV_PRE_UP
|
|
* NETDEV_PRE_TYPE_CHANGE
|
|
* NETDEV_POST_INIT
|
|
* NETDEV_PRECHANGEMTU
|
|
* NETDEV_PRECHANGEUPPER
|
|
|
|
Example: Inject netdevice mtu change error (-22 == -EINVAL)
|
|
|
|
# cd /sys/kernel/debug/notifier-error-inject/netdev
|
|
# echo -22 > actions/NETDEV_CHANGEMTU/error
|
|
# ip link set eth0 mtu 1024
|
|
RTNETLINK answers: Invalid argument
|
|
|
|
For more usage examples
|
|
-----------------------
|
|
There are tools/testing/selftests using the notifier error injection features
|
|
for CPU and memory notifiers.
|
|
|
|
* tools/testing/selftests/cpu-hotplug/on-off-test.sh
|
|
* tools/testing/selftests/memory-hotplug/on-off-test.sh
|
|
|
|
These scripts first do simple online and offline tests and then do fault
|
|
injection tests if notifier error injection module is available.
|