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.

  • PM notifier
  • Memory hotplug notifier
  • powerpc pSeries reconfig notifier
  • Netdevice notifier

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
  • NETDEV_CHANGEUPPER

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.