Linux 3.11-rc3
[cris-mirror.git] / tools / testing / fault-injection / failcmd.sh
blob78a9ed7fecdb3406dba7e266aefc89648a534856
1 #!/bin/bash
3 # NAME
4 # failcmd.sh - run a command with injecting slab/page allocation failures
6 # SYNOPSIS
7 # failcmd.sh --help
8 # failcmd.sh [<options>] command [arguments]
10 # DESCRIPTION
11 # Run command with injecting slab/page allocation failures by fault
12 # injection.
14 # NOTE: you need to run this script as root.
17 usage()
19 cat >&2 <<EOF
20 Usage: $0 [options] command [arguments]
22 OPTIONS
23 -p percent
24 --probability=percent
25 likelihood of failure injection, in percent.
26 Default value is 1
28 -t value
29 --times=value
30 specifies how many times failures may happen at most.
31 Default value is 1
33 --oom-kill-allocating-task=value
34 set /proc/sys/vm/oom_kill_allocating_task to specified value
35 before running the command.
36 Default value is 1
38 -h, --help
39 Display a usage message and exit
41 --interval=value, --space=value, --verbose=value, --task-filter=value,
42 --stacktrace-depth=value, --require-start=value, --require-end=value,
43 --reject-start=value, --reject-end=value, --ignore-gfp-wait=value
44 See Documentation/fault-injection/fault-injection.txt for more
45 information
47 failslab options:
48 --cache-filter=value
50 fail_page_alloc options:
51 --ignore-gfp-highmem=value, --min-order=value
53 ENVIRONMENT
54 FAILCMD_TYPE
55 The following values for FAILCMD_TYPE are recognized:
57 failslab
58 inject slab allocation failures
59 fail_page_alloc
60 inject page allocation failures
62 If FAILCMD_TYPE is not defined, then failslab is used.
63 EOF
66 if [ $UID != 0 ]; then
67 echo must be run as root >&2
68 exit 1
71 DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3}'`
73 if [ ! -d "$DEBUGFS" ]; then
74 echo debugfs is not mounted >&2
75 exit 1
78 FAILCMD_TYPE=${FAILCMD_TYPE:-failslab}
79 FAULTATTR=$DEBUGFS/$FAILCMD_TYPE
81 if [ ! -d $FAULTATTR ]; then
82 echo $FAILCMD_TYPE is not available >&2
83 exit 1
86 LONGOPTS=probability:,interval:,times:,space:,verbose:,task-filter:
87 LONGOPTS=$LONGOPTS,stacktrace-depth:,require-start:,require-end:
88 LONGOPTS=$LONGOPTS,reject-start:,reject-end:,oom-kill-allocating-task:,help
90 if [ $FAILCMD_TYPE = failslab ]; then
91 LONGOPTS=$LONGOPTS,ignore-gfp-wait:,cache-filter:
92 elif [ $FAILCMD_TYPE = fail_page_alloc ]; then
93 LONGOPTS=$LONGOPTS,ignore-gfp-wait:,ignore-gfp-highmem:,min-order:
96 TEMP=`getopt -o p:i:t:s:v:h --long $LONGOPTS -n 'failcmd.sh' -- "$@"`
98 if [ $? != 0 ]; then
99 usage
100 exit 1
103 eval set -- "$TEMP"
105 fault_attr_default()
107 echo N > $FAULTATTR/task-filter
108 echo 0 > $FAULTATTR/probability
109 echo 1 > $FAULTATTR/times
112 fault_attr_default
114 oom_kill_allocating_task_saved=`cat /proc/sys/vm/oom_kill_allocating_task`
116 restore_values()
118 fault_attr_default
119 echo $oom_kill_allocating_task_saved \
120 > /proc/sys/vm/oom_kill_allocating_task
124 # Default options
126 declare -i oom_kill_allocating_task=1
127 declare task_filter=Y
128 declare -i probability=1
129 declare -i times=1
131 while true; do
132 case "$1" in
133 -p|--probability)
134 probability=$2
135 shift 2
137 -i|--interval)
138 echo $2 > $FAULTATTR/interval
139 shift 2
141 -t|--times)
142 times=$2
143 shift 2
145 -s|--space)
146 echo $2 > $FAULTATTR/space
147 shift 2
149 -v|--verbose)
150 echo $2 > $FAULTATTR/verbose
151 shift 2
153 --task-filter)
154 task_filter=$2
155 shift 2
157 --stacktrace-depth)
158 echo $2 > $FAULTATTR/stacktrace-depth
159 shift 2
161 --require-start)
162 echo $2 > $FAULTATTR/require-start
163 shift 2
165 --require-end)
166 echo $2 > $FAULTATTR/require-end
167 shift 2
169 --reject-start)
170 echo $2 > $FAULTATTR/reject-start
171 shift 2
173 --reject-end)
174 echo $2 > $FAULTATTR/reject-end
175 shift 2
177 --oom-kill-allocating-task)
178 oom_kill_allocating_task=$2
179 shift 2
181 --ignore-gfp-wait)
182 echo $2 > $FAULTATTR/ignore-gfp-wait
183 shift 2
185 --cache-filter)
186 echo $2 > $FAULTATTR/cache_filter
187 shift 2
189 --ignore-gfp-highmem)
190 echo $2 > $FAULTATTR/ignore-gfp-highmem
191 shift 2
193 --min-order)
194 echo $2 > $FAULTATTR/min-order
195 shift 2
197 -h|--help)
198 usage
199 exit 0
200 shift
203 shift
204 break
206 esac
207 done
209 [ -z "$1" ] && exit 0
211 echo $oom_kill_allocating_task > /proc/sys/vm/oom_kill_allocating_task
212 echo $task_filter > $FAULTATTR/task-filter
213 echo $probability > $FAULTATTR/probability
214 echo $times > $FAULTATTR/times
216 trap "restore_values" SIGINT SIGTERM EXIT
218 cmd="echo 1 > /proc/self/make-it-fail && exec $@"
219 bash -c "$cmd"