2 # SPDX-License-Identifier: GPL-2.0
5 # failcmd.sh - run a command with injecting slab/page allocation failures
9 # failcmd.sh [<options>] command [arguments]
12 # Run command with injecting slab/page allocation failures by fault
15 # NOTE: you need to run this script as root.
21 Usage: $0 [options] command [arguments]
26 likelihood of failure injection, in percent.
31 specifies how many times failures may happen at most.
34 --oom-kill-allocating-task=value
35 set /proc/sys/vm/oom_kill_allocating_task to specified value
36 before running the command.
40 Display a usage message and exit
42 --interval=value, --space=value, --verbose=value, --task-filter=value,
43 --stacktrace-depth=value, --require-start=value, --require-end=value,
44 --reject-start=value, --reject-end=value, --ignore-gfp-wait=value
45 See Documentation/fault-injection/fault-injection.rst for more
51 fail_page_alloc options:
52 --ignore-gfp-highmem=value, --min-order=value
56 The following values for FAILCMD_TYPE are recognized:
59 inject slab allocation failures
61 inject page allocation failures
63 If FAILCMD_TYPE is not defined, then failslab is used.
69 if ! [[ $value =~ ^
0x
[0-9a-fA-F]+$
]]; then
70 echo "Error: The provided value '$value' is not a valid hexadecimal number." >&2
75 if [ $UID != 0 ]; then
76 echo must be run as root
>&2
80 DEBUGFS
=`mount -t debugfs | head -1 | awk '{ print $3}'`
82 if [ ! -d "$DEBUGFS" ]; then
83 echo debugfs is not mounted
>&2
87 FAILCMD_TYPE
=${FAILCMD_TYPE:-failslab}
88 FAULTATTR
=$DEBUGFS/$FAILCMD_TYPE
90 if [ ! -d $FAULTATTR ]; then
91 echo $FAILCMD_TYPE is not available
>&2
95 LONGOPTS
=probability
:,interval
:,times:,space
:,verbose
:,task-filter
:
96 LONGOPTS
=$LONGOPTS,stacktrace-depth
:,require-start
:,require-end
:
97 LONGOPTS
=$LONGOPTS,reject-start
:,reject-end
:,oom-kill-allocating-task
:,help
99 if [ $FAILCMD_TYPE = failslab
]; then
100 LONGOPTS
=$LONGOPTS,ignore-gfp-wait
:,cache-filter
:
101 elif [ $FAILCMD_TYPE = fail_page_alloc
]; then
102 LONGOPTS
=$LONGOPTS,ignore-gfp-wait
:,ignore-gfp-highmem
:,min-order
:
105 TEMP
=`getopt -o p:i:t:s:v:h --long $LONGOPTS -n 'failcmd.sh' -- "$@"`
116 echo N
> $FAULTATTR/task-filter
117 echo 0 > $FAULTATTR/probability
118 echo 1 > $FAULTATTR/times
123 oom_kill_allocating_task_saved
=`cat /proc/sys/vm/oom_kill_allocating_task`
128 echo $oom_kill_allocating_task_saved \
129 > /proc
/sys
/vm
/oom_kill_allocating_task
135 declare -i oom_kill_allocating_task
=1
136 declare task_filter
=Y
137 declare -i probability
=1
147 echo $2 > $FAULTATTR/interval
155 echo $2 > $FAULTATTR/space
159 echo $2 > $FAULTATTR/verbose
167 echo $2 > $FAULTATTR/stacktrace-depth
172 echo $2 > $FAULTATTR/require-start
177 echo $2 > $FAULTATTR/require-end
182 echo $2 > $FAULTATTR/reject-start
187 echo $2 > $FAULTATTR/reject-end
190 --oom-kill-allocating-task)
191 oom_kill_allocating_task
=$2
195 echo $2 > $FAULTATTR/ignore-gfp-wait
199 echo $2 > $FAULTATTR/cache_filter
202 --ignore-gfp-highmem)
203 echo $2 > $FAULTATTR/ignore-gfp-highmem
207 echo $2 > $FAULTATTR/min-order
222 [ -z "$1" ] && exit 0
224 echo $oom_kill_allocating_task > /proc
/sys
/vm
/oom_kill_allocating_task
225 echo $task_filter > $FAULTATTR/task-filter
226 echo $probability > $FAULTATTR/probability
227 echo $times > $FAULTATTR/times
229 trap "restore_values" SIGINT SIGTERM EXIT
231 cmd
="echo 1 > /proc/self/make-it-fail && exec $@"