通知器错误注入

通知器错误注入提供了一种向指定的通知链回调注入人为错误的能力。这对于测试在正常情况下很少被执行的通知调用链错误处理非常有用。可以使用以下内核模块来测试对应的通知器。

  • PM 通知器

  • 内存热插拔通知器

  • powerpc pSeries 重新配置通知器

  • 网络设备通知器

PM 通知器错误注入模块

该特性通过 debugfs 接口进行控制

/sys/kernel/debug/notifier-error-inject/pm/actions/<notifier event>/error

可以被注入错误的 PM 通知器事件包括

  • PM_HIBERNATION_PREPARE

  • PM_SUSPEND_PREPARE

  • PM_RESTORE_PREPARE

示例:注入 PM 挂起(suspend)错误 (-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

内存热插拔通知器错误注入模块

该特性通过 debugfs 接口进行控制

/sys/kernel/debug/notifier-error-inject/memory/actions/<notifier event>/error

可以被注入错误的内存通知器事件包括

  • MEM_GOING_ONLINE

  • MEM_GOING_OFFLINE

示例:注入内存热插拔下线(offline)错误 (-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 重新配置通知器错误注入模块

该特性通过 debugfs 接口进行控制

/sys/kernel/debug/notifier-error-inject/pSeries-reconfig/actions/<notifier event>/error

可以被注入错误的 pSeries 重新配置通知器事件包括

  • PSERIES_RECONFIG_ADD

  • PSERIES_RECONFIG_REMOVE

  • PSERIES_DRCONF_MEM_ADD

  • PSERIES_DRCONF_MEM_REMOVE

网络设备通知器错误注入模块

该特性通过 debugfs 接口进行控制

/sys/kernel/debug/notifier-error-inject/netdev/actions/<notifier event>/error

可以被注入错误的网卡(Netdevice)通知器事件包括

  • NETDEV_REGISTER

  • NETDEV_CHANGEMTU

  • NETDEV_CHANGENAME

  • NETDEV_PRE_UP

  • NETDEV_PRE_TYPE_CHANGE

  • NETDEV_POST_INIT

  • NETDEV_PRECHANGEMTU

  • NETDEV_PRECHANGEUPPER

  • NETDEV_CHANGEUPPER

示例:注入网络设备 MTU 更改错误 (-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

更多用法示例

有一些 tools/testing/selftests 使用了 CPU 和内存通知器的错误注入特性。

  • tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh

  • tools/testing/selftests/memory-hotplug/mem-on-off-test.sh

这些脚本首先执行简单的上下线测试,如果通知器错误注入模块可用,则随后执行故障注入测试。