Merge branch 'akpm' (Andrew's patch-bomb)
Merge Andrew's first set of patches: "Non-MM patches: - lots of misc bits - tree-wide have_clk() cleanups - quite a lot of printk tweaks. I draw your attention to "printk: convert the format for KERN_<LEVEL> to a 2 byte pattern" which looks a bit scary. But afaict it's solid. - backlight updates - lib/ feature work (notably the addition and use of memweight()) - checkpatch updates - rtc updates - nilfs updates - fatfs updates (partial, still waiting for acks) - kdump, proc, fork, IPC, sysctl, taskstats, pps, etc - new fault-injection feature work" * Merge emailed patches from Andrew Morton <akpm@linux-foundation.org>: (128 commits) drivers/misc/lkdtm.c: fix missing allocation failure check lib/scatterlist: do not re-write gfp_flags in __sg_alloc_table() fault-injection: add tool to run command with failslab or fail_page_alloc fault-injection: add selftests for cpu and memory hotplug powerpc: pSeries reconfig notifier error injection module memory: memory notifier error injection module PM: PM notifier error injection module cpu: rewrite cpu-notifier-error-inject module fault-injection: notifier error injection c/r: fcntl: add F_GETOWNER_UIDS option resource: make sure requested range is included in the root range include/linux/aio.h: cpp->C conversions fs: cachefiles: add support for large files in filesystem caching pps: return PTR_ERR on error in device_create taskstats: check nla_reserve() return sysctl: suppress kmemleak messages ipc: use Kconfig options for __ARCH_WANT_[COMPAT_]IPC_PARSE_VERSION ipc: compat: use signed size_t types for msgsnd and msgrcv ipc: allow compat IPC version field parsing if !ARCH_WANT_OLD_COMPAT_IPC ipc: add COMPAT_SHMLBA support ...
Цей коміт міститься в:
219
tools/testing/fault-injection/failcmd.sh
Звичайний файл
219
tools/testing/fault-injection/failcmd.sh
Звичайний файл
@@ -0,0 +1,219 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# NAME
|
||||
# failcmd.sh - run a command with injecting slab/page allocation failures
|
||||
#
|
||||
# SYNOPSIS
|
||||
# failcmd.sh --help
|
||||
# failcmd.sh [<options>] command [arguments]
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Run command with injecting slab/page allocation failures by fault
|
||||
# injection.
|
||||
#
|
||||
# NOTE: you need to run this script as root.
|
||||
#
|
||||
|
||||
usage()
|
||||
{
|
||||
cat >&2 <<EOF
|
||||
Usage: $0 [options] command [arguments]
|
||||
|
||||
OPTIONS
|
||||
-p percent
|
||||
--probability=percent
|
||||
likelihood of failure injection, in percent.
|
||||
Default value is 1
|
||||
|
||||
-t value
|
||||
--times=value
|
||||
specifies how many times failures may happen at most.
|
||||
Default value is 1
|
||||
|
||||
--oom-kill-allocating-task=value
|
||||
set /proc/sys/vm/oom_kill_allocating_task to specified value
|
||||
before running the command.
|
||||
Default value is 1
|
||||
|
||||
-h, --help
|
||||
Display a usage message and exit
|
||||
|
||||
--interval=value, --space=value, --verbose=value, --task-filter=value,
|
||||
--stacktrace-depth=value, --require-start=value, --require-end=value,
|
||||
--reject-start=value, --reject-end=value, --ignore-gfp-wait=value
|
||||
See Documentation/fault-injection/fault-injection.txt for more
|
||||
information
|
||||
|
||||
failslab options:
|
||||
--cache-filter=value
|
||||
|
||||
fail_page_alloc options:
|
||||
--ignore-gfp-highmem=value, --min-order=value
|
||||
|
||||
ENVIRONMENT
|
||||
FAILCMD_TYPE
|
||||
The following values for FAILCMD_TYPE are recognized:
|
||||
|
||||
failslab
|
||||
inject slab allocation failures
|
||||
fail_page_alloc
|
||||
inject page allocation failures
|
||||
|
||||
If FAILCMD_TYPE is not defined, then failslab is used.
|
||||
EOF
|
||||
}
|
||||
|
||||
if [ $UID != 0 ]; then
|
||||
echo must be run as root >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3}'`
|
||||
|
||||
if [ ! -d "$DEBUGFS" ]; then
|
||||
echo debugfs is not mounted >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FAILCMD_TYPE=${FAILCMD_TYPE:-failslab}
|
||||
FAULTATTR=$DEBUGFS/$FAILCMD_TYPE
|
||||
|
||||
if [ ! -d $FAULTATTR ]; then
|
||||
echo $FAILCMD_TYPE is not available >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LONGOPTS=probability:,interval:,times:,space:,verbose:,task-filter:
|
||||
LONGOPTS=$LONGOPTS,stacktrace-depth:,require-start:,require-end:
|
||||
LONGOPTS=$LONGOPTS,reject-start:,reject-end:,oom-kill-allocating-task:,help
|
||||
|
||||
if [ $FAILCMD_TYPE = failslab ]; then
|
||||
LONGOPTS=$LONGOPTS,ignore-gfp-wait:,cache-filter:
|
||||
elif [ $FAILCMD_TYPE = fail_page_alloc ]; then
|
||||
LONGOPTS=$LONGOPTS,ignore-gfp-wait:,ignore-gfp-highmem:,min-order:
|
||||
fi
|
||||
|
||||
TEMP=`getopt -o p:i:t:s:v:h --long $LONGOPTS -n 'failcmd.sh' -- "$@"`
|
||||
|
||||
if [ $? != 0 ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
eval set -- "$TEMP"
|
||||
|
||||
fault_attr_default()
|
||||
{
|
||||
echo N > $FAULTATTR/task-filter
|
||||
echo 0 > $FAULTATTR/probability
|
||||
echo 1 > $FAULTATTR/times
|
||||
}
|
||||
|
||||
fault_attr_default
|
||||
|
||||
oom_kill_allocating_task_saved=`cat /proc/sys/vm/oom_kill_allocating_task`
|
||||
|
||||
restore_values()
|
||||
{
|
||||
fault_attr_default
|
||||
echo $oom_kill_allocating_task_saved \
|
||||
> /proc/sys/vm/oom_kill_allocating_task
|
||||
}
|
||||
|
||||
#
|
||||
# Default options
|
||||
#
|
||||
declare -i oom_kill_allocating_task=1
|
||||
declare task_filter=Y
|
||||
declare -i probability=1
|
||||
declare -i times=1
|
||||
|
||||
while true; do
|
||||
case "$1" in
|
||||
-p|--probability)
|
||||
probability=$2
|
||||
shift 2
|
||||
;;
|
||||
-i|--interval)
|
||||
echo $2 > $FAULTATTR/interval
|
||||
shift 2
|
||||
;;
|
||||
-t|--times)
|
||||
times=$2
|
||||
shift 2
|
||||
;;
|
||||
-s|--space)
|
||||
echo $2 > $FAULTATTR/space
|
||||
shift 2
|
||||
;;
|
||||
-v|--verbose)
|
||||
echo $2 > $FAULTATTR/verbose
|
||||
shift 2
|
||||
;;
|
||||
--task-filter)
|
||||
task_filter=$2
|
||||
shift 2
|
||||
;;
|
||||
--stacktrace-depth)
|
||||
echo $2 > $FAULTATTR/stacktrace-depth
|
||||
shift 2
|
||||
;;
|
||||
--require-start)
|
||||
echo $2 > $FAULTATTR/require-start
|
||||
shift 2
|
||||
;;
|
||||
--require-end)
|
||||
echo $2 > $FAULTATTR/require-end
|
||||
shift 2
|
||||
;;
|
||||
--reject-start)
|
||||
echo $2 > $FAULTATTR/reject-start
|
||||
shift 2
|
||||
;;
|
||||
--reject-end)
|
||||
echo $2 > $FAULTATTR/reject-end
|
||||
shift 2
|
||||
;;
|
||||
--oom-kill-allocating-task)
|
||||
oom_kill_allocating_task=$2
|
||||
shift 2
|
||||
;;
|
||||
--ignore-gfp-wait)
|
||||
echo $2 > $FAULTATTR/ignore-gfp-wait
|
||||
shift 2
|
||||
;;
|
||||
--cache-filter)
|
||||
echo $2 > $FAULTATTR/cache_filter
|
||||
shift 2
|
||||
;;
|
||||
--ignore-gfp-highmem)
|
||||
echo $2 > $FAULTATTR/ignore-gfp-highmem
|
||||
shift 2
|
||||
;;
|
||||
--min-order)
|
||||
echo $2 > $FAULTATTR/min-order
|
||||
shift 2
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
shift
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
[ -z "$@" ] && exit 0
|
||||
|
||||
echo $oom_kill_allocating_task > /proc/sys/vm/oom_kill_allocating_task
|
||||
echo $task_filter > $FAULTATTR/task-filter
|
||||
echo $probability > $FAULTATTR/probability
|
||||
echo $times > $FAULTATTR/times
|
||||
|
||||
trap "restore_values" SIGINT SIGTERM EXIT
|
||||
|
||||
cmd="echo 1 > /proc/self/make-it-fail && exec $@"
|
||||
bash -c "$cmd"
|
@@ -1,4 +1,4 @@
|
||||
TARGETS = breakpoints kcmp mqueue vm
|
||||
TARGETS = breakpoints kcmp mqueue vm cpu-hotplug memory-hotplug
|
||||
|
||||
all:
|
||||
for TARGET in $(TARGETS); do \
|
||||
|
6
tools/testing/selftests/cpu-hotplug/Makefile
Звичайний файл
6
tools/testing/selftests/cpu-hotplug/Makefile
Звичайний файл
@@ -0,0 +1,6 @@
|
||||
all:
|
||||
|
||||
run_tests:
|
||||
./on-off-test.sh
|
||||
|
||||
clean:
|
221
tools/testing/selftests/cpu-hotplug/on-off-test.sh
Звичайний файл
221
tools/testing/selftests/cpu-hotplug/on-off-test.sh
Звичайний файл
@@ -0,0 +1,221 @@
|
||||
#!/bin/bash
|
||||
|
||||
SYSFS=
|
||||
|
||||
prerequisite()
|
||||
{
|
||||
msg="skip all tests:"
|
||||
|
||||
if [ $UID != 0 ]; then
|
||||
echo $msg must be run as root >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
|
||||
|
||||
if [ ! -d "$SYSFS" ]; then
|
||||
echo $msg sysfs is not mounted >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if ! ls $SYSFS/devices/system/cpu/cpu* > /dev/null 2>&1; then
|
||||
echo $msg cpu hotplug is not supported >&2
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# list all hot-pluggable CPUs
|
||||
#
|
||||
hotpluggable_cpus()
|
||||
{
|
||||
local state=${1:-.\*}
|
||||
|
||||
for cpu in $SYSFS/devices/system/cpu/cpu*; do
|
||||
if [ -f $cpu/online ] && grep -q $state $cpu/online; then
|
||||
echo ${cpu##/*/cpu}
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
hotplaggable_offline_cpus()
|
||||
{
|
||||
hotpluggable_cpus 0
|
||||
}
|
||||
|
||||
hotpluggable_online_cpus()
|
||||
{
|
||||
hotpluggable_cpus 1
|
||||
}
|
||||
|
||||
cpu_is_online()
|
||||
{
|
||||
grep -q 1 $SYSFS/devices/system/cpu/cpu$1/online
|
||||
}
|
||||
|
||||
cpu_is_offline()
|
||||
{
|
||||
grep -q 0 $SYSFS/devices/system/cpu/cpu$1/online
|
||||
}
|
||||
|
||||
online_cpu()
|
||||
{
|
||||
echo 1 > $SYSFS/devices/system/cpu/cpu$1/online
|
||||
}
|
||||
|
||||
offline_cpu()
|
||||
{
|
||||
echo 0 > $SYSFS/devices/system/cpu/cpu$1/online
|
||||
}
|
||||
|
||||
online_cpu_expect_success()
|
||||
{
|
||||
local cpu=$1
|
||||
|
||||
if ! online_cpu $cpu; then
|
||||
echo $FUNCNAME $cpu: unexpected fail >&2
|
||||
elif ! cpu_is_online $cpu; then
|
||||
echo $FUNCNAME $cpu: unexpected offline >&2
|
||||
fi
|
||||
}
|
||||
|
||||
online_cpu_expect_fail()
|
||||
{
|
||||
local cpu=$1
|
||||
|
||||
if online_cpu $cpu 2> /dev/null; then
|
||||
echo $FUNCNAME $cpu: unexpected success >&2
|
||||
elif ! cpu_is_offline $cpu; then
|
||||
echo $FUNCNAME $cpu: unexpected online >&2
|
||||
fi
|
||||
}
|
||||
|
||||
offline_cpu_expect_success()
|
||||
{
|
||||
local cpu=$1
|
||||
|
||||
if ! offline_cpu $cpu; then
|
||||
echo $FUNCNAME $cpu: unexpected fail >&2
|
||||
elif ! cpu_is_offline $cpu; then
|
||||
echo $FUNCNAME $cpu: unexpected offline >&2
|
||||
fi
|
||||
}
|
||||
|
||||
offline_cpu_expect_fail()
|
||||
{
|
||||
local cpu=$1
|
||||
|
||||
if offline_cpu $cpu 2> /dev/null; then
|
||||
echo $FUNCNAME $cpu: unexpected success >&2
|
||||
elif ! cpu_is_online $cpu; then
|
||||
echo $FUNCNAME $cpu: unexpected offline >&2
|
||||
fi
|
||||
}
|
||||
|
||||
error=-12
|
||||
priority=0
|
||||
|
||||
while getopts e:hp: opt; do
|
||||
case $opt in
|
||||
e)
|
||||
error=$OPTARG
|
||||
;;
|
||||
h)
|
||||
echo "Usage $0 [ -e errno ] [ -p notifier-priority ]"
|
||||
exit
|
||||
;;
|
||||
p)
|
||||
priority=$OPTARG
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if ! [ "$error" -ge -4095 -a "$error" -lt 0 ]; then
|
||||
echo "error code must be -4095 <= errno < 0" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
prerequisite
|
||||
|
||||
#
|
||||
# Online all hot-pluggable CPUs
|
||||
#
|
||||
for cpu in `hotplaggable_offline_cpus`; do
|
||||
online_cpu_expect_success $cpu
|
||||
done
|
||||
|
||||
#
|
||||
# Offline all hot-pluggable CPUs
|
||||
#
|
||||
for cpu in `hotpluggable_online_cpus`; do
|
||||
offline_cpu_expect_success $cpu
|
||||
done
|
||||
|
||||
#
|
||||
# Online all hot-pluggable CPUs again
|
||||
#
|
||||
for cpu in `hotplaggable_offline_cpus`; do
|
||||
online_cpu_expect_success $cpu
|
||||
done
|
||||
|
||||
#
|
||||
# Test with cpu notifier error injection
|
||||
#
|
||||
|
||||
DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'`
|
||||
NOTIFIER_ERR_INJECT_DIR=$DEBUGFS/notifier-error-inject/cpu
|
||||
|
||||
prerequisite_extra()
|
||||
{
|
||||
msg="skip extra tests:"
|
||||
|
||||
/sbin/modprobe -q -r cpu-notifier-error-inject
|
||||
/sbin/modprobe -q cpu-notifier-error-inject priority=$priority
|
||||
|
||||
if [ ! -d "$DEBUGFS" ]; then
|
||||
echo $msg debugfs is not mounted >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -d $NOTIFIER_ERR_INJECT_DIR ]; then
|
||||
echo $msg cpu-notifier-error-inject module is not available >&2
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
prerequisite_extra
|
||||
|
||||
#
|
||||
# Offline all hot-pluggable CPUs
|
||||
#
|
||||
echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_DOWN_PREPARE/error
|
||||
for cpu in `hotpluggable_online_cpus`; do
|
||||
offline_cpu_expect_success $cpu
|
||||
done
|
||||
|
||||
#
|
||||
# Test CPU hot-add error handling (offline => online)
|
||||
#
|
||||
echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_UP_PREPARE/error
|
||||
for cpu in `hotplaggable_offline_cpus`; do
|
||||
online_cpu_expect_fail $cpu
|
||||
done
|
||||
|
||||
#
|
||||
# Online all hot-pluggable CPUs
|
||||
#
|
||||
echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_UP_PREPARE/error
|
||||
for cpu in `hotplaggable_offline_cpus`; do
|
||||
online_cpu_expect_success $cpu
|
||||
done
|
||||
|
||||
#
|
||||
# Test CPU hot-remove error handling (online => offline)
|
||||
#
|
||||
echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_DOWN_PREPARE/error
|
||||
for cpu in `hotpluggable_online_cpus`; do
|
||||
offline_cpu_expect_fail $cpu
|
||||
done
|
||||
|
||||
echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_DOWN_PREPARE/error
|
||||
/sbin/modprobe -q -r cpu-notifier-error-inject
|
6
tools/testing/selftests/memory-hotplug/Makefile
Звичайний файл
6
tools/testing/selftests/memory-hotplug/Makefile
Звичайний файл
@@ -0,0 +1,6 @@
|
||||
all:
|
||||
|
||||
run_tests:
|
||||
./on-off-test.sh
|
||||
|
||||
clean:
|
230
tools/testing/selftests/memory-hotplug/on-off-test.sh
Звичайний файл
230
tools/testing/selftests/memory-hotplug/on-off-test.sh
Звичайний файл
@@ -0,0 +1,230 @@
|
||||
#!/bin/bash
|
||||
|
||||
SYSFS=
|
||||
|
||||
prerequisite()
|
||||
{
|
||||
msg="skip all tests:"
|
||||
|
||||
if [ $UID != 0 ]; then
|
||||
echo $msg must be run as root >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
|
||||
|
||||
if [ ! -d "$SYSFS" ]; then
|
||||
echo $msg sysfs is not mounted >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if ! ls $SYSFS/devices/system/memory/memory* > /dev/null 2>&1; then
|
||||
echo $msg memory hotplug is not supported >&2
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# list all hot-pluggable memory
|
||||
#
|
||||
hotpluggable_memory()
|
||||
{
|
||||
local state=${1:-.\*}
|
||||
|
||||
for memory in $SYSFS/devices/system/memory/memory*; do
|
||||
if grep -q 1 $memory/removable &&
|
||||
grep -q $state $memory/state; then
|
||||
echo ${memory##/*/memory}
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
hotplaggable_offline_memory()
|
||||
{
|
||||
hotpluggable_memory offline
|
||||
}
|
||||
|
||||
hotpluggable_online_memory()
|
||||
{
|
||||
hotpluggable_memory online
|
||||
}
|
||||
|
||||
memory_is_online()
|
||||
{
|
||||
grep -q online $SYSFS/devices/system/memory/memory$1/state
|
||||
}
|
||||
|
||||
memory_is_offline()
|
||||
{
|
||||
grep -q offline $SYSFS/devices/system/memory/memory$1/state
|
||||
}
|
||||
|
||||
online_memory()
|
||||
{
|
||||
echo online > $SYSFS/devices/system/memory/memory$1/state
|
||||
}
|
||||
|
||||
offline_memory()
|
||||
{
|
||||
echo offline > $SYSFS/devices/system/memory/memory$1/state
|
||||
}
|
||||
|
||||
online_memory_expect_success()
|
||||
{
|
||||
local memory=$1
|
||||
|
||||
if ! online_memory $memory; then
|
||||
echo $FUNCNAME $memory: unexpected fail >&2
|
||||
elif ! memory_is_online $memory; then
|
||||
echo $FUNCNAME $memory: unexpected offline >&2
|
||||
fi
|
||||
}
|
||||
|
||||
online_memory_expect_fail()
|
||||
{
|
||||
local memory=$1
|
||||
|
||||
if online_memory $memory 2> /dev/null; then
|
||||
echo $FUNCNAME $memory: unexpected success >&2
|
||||
elif ! memory_is_offline $memory; then
|
||||
echo $FUNCNAME $memory: unexpected online >&2
|
||||
fi
|
||||
}
|
||||
|
||||
offline_memory_expect_success()
|
||||
{
|
||||
local memory=$1
|
||||
|
||||
if ! offline_memory $memory; then
|
||||
echo $FUNCNAME $memory: unexpected fail >&2
|
||||
elif ! memory_is_offline $memory; then
|
||||
echo $FUNCNAME $memory: unexpected offline >&2
|
||||
fi
|
||||
}
|
||||
|
||||
offline_memory_expect_fail()
|
||||
{
|
||||
local memory=$1
|
||||
|
||||
if offline_memory $memory 2> /dev/null; then
|
||||
echo $FUNCNAME $memory: unexpected success >&2
|
||||
elif ! memory_is_online $memory; then
|
||||
echo $FUNCNAME $memory: unexpected offline >&2
|
||||
fi
|
||||
}
|
||||
|
||||
error=-12
|
||||
priority=0
|
||||
ratio=10
|
||||
|
||||
while getopts e:hp:r: opt; do
|
||||
case $opt in
|
||||
e)
|
||||
error=$OPTARG
|
||||
;;
|
||||
h)
|
||||
echo "Usage $0 [ -e errno ] [ -p notifier-priority ] [ -r percent-of-memory-to-offline ]"
|
||||
exit
|
||||
;;
|
||||
p)
|
||||
priority=$OPTARG
|
||||
;;
|
||||
r)
|
||||
ratio=$OPTARG
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if ! [ "$error" -ge -4095 -a "$error" -lt 0 ]; then
|
||||
echo "error code must be -4095 <= errno < 0" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
prerequisite
|
||||
|
||||
#
|
||||
# Online all hot-pluggable memory
|
||||
#
|
||||
for memory in `hotplaggable_offline_memory`; do
|
||||
online_memory_expect_success $memory
|
||||
done
|
||||
|
||||
#
|
||||
# Offline $ratio percent of hot-pluggable memory
|
||||
#
|
||||
for memory in `hotpluggable_online_memory`; do
|
||||
if [ $((RANDOM % 100)) -lt $ratio ]; then
|
||||
offline_memory_expect_success $memory
|
||||
fi
|
||||
done
|
||||
|
||||
#
|
||||
# Online all hot-pluggable memory again
|
||||
#
|
||||
for memory in `hotplaggable_offline_memory`; do
|
||||
online_memory_expect_success $memory
|
||||
done
|
||||
|
||||
#
|
||||
# Test with memory notifier error injection
|
||||
#
|
||||
|
||||
DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'`
|
||||
NOTIFIER_ERR_INJECT_DIR=$DEBUGFS/notifier-error-inject/memory
|
||||
|
||||
prerequisite_extra()
|
||||
{
|
||||
msg="skip extra tests:"
|
||||
|
||||
/sbin/modprobe -q -r memory-notifier-error-inject
|
||||
/sbin/modprobe -q memory-notifier-error-inject priority=$priority
|
||||
|
||||
if [ ! -d "$DEBUGFS" ]; then
|
||||
echo $msg debugfs is not mounted >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -d $NOTIFIER_ERR_INJECT_DIR ]; then
|
||||
echo $msg memory-notifier-error-inject module is not available >&2
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
prerequisite_extra
|
||||
|
||||
#
|
||||
# Offline $ratio percent of hot-pluggable memory
|
||||
#
|
||||
echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error
|
||||
for memory in `hotpluggable_online_memory`; do
|
||||
if [ $((RANDOM % 100)) -lt $ratio ]; then
|
||||
offline_memory_expect_success $memory
|
||||
fi
|
||||
done
|
||||
|
||||
#
|
||||
# Test memory hot-add error handling (offline => online)
|
||||
#
|
||||
echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_ONLINE/error
|
||||
for memory in `hotplaggable_offline_memory`; do
|
||||
online_memory_expect_fail $memory
|
||||
done
|
||||
|
||||
#
|
||||
# Online all hot-pluggable memory
|
||||
#
|
||||
echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_ONLINE/error
|
||||
for memory in `hotplaggable_offline_memory`; do
|
||||
online_memory_expect_success $memory
|
||||
done
|
||||
|
||||
#
|
||||
# Test memory hot-remove error handling (online => offline)
|
||||
#
|
||||
echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error
|
||||
for memory in `hotpluggable_online_memory`; do
|
||||
offline_memory_expect_fail $memory
|
||||
done
|
||||
|
||||
echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error
|
||||
/sbin/modprobe -q -r memory-notifier-error-inject
|
Посилання в новій задачі
Заблокувати користувача