Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1#!/bin/bash
  2#
  3# NAME
  4#	failcmd.sh - run a command with injecting slab/page allocation failures
  5#
  6# SYNOPSIS
  7#	failcmd.sh --help
  8#	failcmd.sh [<options>] command [arguments]
  9#
 10# DESCRIPTION
 11#	Run command with injecting slab/page allocation failures by fault
 12#	injection.
 13#
 14#	NOTE: you need to run this script as root.
 15#
 16
 17usage()
 18{
 19	cat >&2 <<EOF
 20Usage: $0 [options] command [arguments]
 21
 22OPTIONS
 23	-p percent
 24	--probability=percent
 25		likelihood of failure injection, in percent.
 26		Default value is 1
 27
 28	-t value
 29	--times=value
 30		specifies how many times failures may happen at most.
 31		Default value is 1
 32
 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
 37
 38	-h, --help
 39		Display a usage message and exit
 40
 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
 46
 47	failslab options:
 48	--cache-filter=value
 49
 50	fail_page_alloc options:
 51	--ignore-gfp-highmem=value, --min-order=value
 52
 53ENVIRONMENT
 54	FAILCMD_TYPE
 55		The following values for FAILCMD_TYPE are recognized:
 56
 57		failslab
 58			inject slab allocation failures
 59		fail_page_alloc
 60			inject page allocation failures
 61
 62		If FAILCMD_TYPE is not defined, then failslab is used.
 63EOF
 64}
 65
 66if [ $UID != 0 ]; then
 67	echo must be run as root >&2
 68	exit 1
 69fi
 70
 71DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3}'`
 72
 73if [ ! -d "$DEBUGFS" ]; then
 74	echo debugfs is not mounted >&2
 75	exit 1
 76fi
 77
 78FAILCMD_TYPE=${FAILCMD_TYPE:-failslab}
 79FAULTATTR=$DEBUGFS/$FAILCMD_TYPE
 80
 81if [ ! -d $FAULTATTR ]; then
 82	echo $FAILCMD_TYPE is not available >&2
 83	exit 1
 84fi
 85
 86LONGOPTS=probability:,interval:,times:,space:,verbose:,task-filter:
 87LONGOPTS=$LONGOPTS,stacktrace-depth:,require-start:,require-end:
 88LONGOPTS=$LONGOPTS,reject-start:,reject-end:,oom-kill-allocating-task:,help
 89
 90if [ $FAILCMD_TYPE = failslab ]; then
 91	LONGOPTS=$LONGOPTS,ignore-gfp-wait:,cache-filter:
 92elif [ $FAILCMD_TYPE = fail_page_alloc ]; then
 93	LONGOPTS=$LONGOPTS,ignore-gfp-wait:,ignore-gfp-highmem:,min-order:
 94fi
 95
 96TEMP=`getopt -o p:i:t:s:v:h --long $LONGOPTS -n 'failcmd.sh' -- "$@"`
 97
 98if [ $? != 0 ]; then
 99	usage
100	exit 1
101fi
102
103eval set -- "$TEMP"
104
105fault_attr_default()
106{
107	echo N > $FAULTATTR/task-filter
108	echo 0 > $FAULTATTR/probability
109	echo 1 > $FAULTATTR/times
110}
111
112fault_attr_default
113
114oom_kill_allocating_task_saved=`cat /proc/sys/vm/oom_kill_allocating_task`
115
116restore_values()
117{
118	fault_attr_default
119	echo $oom_kill_allocating_task_saved \
120		> /proc/sys/vm/oom_kill_allocating_task
121}
122
123#
124# Default options
125#
126declare -i oom_kill_allocating_task=1
127declare task_filter=Y
128declare -i probability=1
129declare -i times=1
130
131while true; do
132	case "$1" in
133	-p|--probability)
134		probability=$2
135		shift 2
136		;;
137	-i|--interval)
138		echo $2 > $FAULTATTR/interval
139		shift 2
140		;;
141	-t|--times)
142		times=$2
143		shift 2
144		;;
145	-s|--space)
146		echo $2 > $FAULTATTR/space
147		shift 2
148		;;
149	-v|--verbose)
150		echo $2 > $FAULTATTR/verbose
151		shift 2
152		;;
153	--task-filter)
154		task_filter=$2
155		shift 2
156		;;
157	--stacktrace-depth)
158		echo $2 > $FAULTATTR/stacktrace-depth
159		shift 2
160		;;
161	--require-start)
162		echo $2 > $FAULTATTR/require-start
163		shift 2
164		;;
165	--require-end)
166		echo $2 > $FAULTATTR/require-end
167		shift 2
168		;;
169	--reject-start)
170		echo $2 > $FAULTATTR/reject-start
171		shift 2
172		;;
173	--reject-end)
174		echo $2 > $FAULTATTR/reject-end
175		shift 2
176		;;
177	--oom-kill-allocating-task)
178		oom_kill_allocating_task=$2
179		shift 2
180		;;
181	--ignore-gfp-wait)
182		echo $2 > $FAULTATTR/ignore-gfp-wait
183		shift 2
184		;;
185	--cache-filter)
186		echo $2 > $FAULTATTR/cache_filter
187		shift 2
188		;;
189	--ignore-gfp-highmem)
190		echo $2 > $FAULTATTR/ignore-gfp-highmem
191		shift 2
192		;;
193	--min-order)
194		echo $2 > $FAULTATTR/min-order
195		shift 2
196		;;
197	-h|--help)
198		usage
199		exit 0
200		shift
201		;;
202	--)
203		shift
204		break
205		;;
206	esac
207done
208
209[ -z "$1" ] && exit 0
210
211echo $oom_kill_allocating_task > /proc/sys/vm/oom_kill_allocating_task
212echo $task_filter > $FAULTATTR/task-filter
213echo $probability > $FAULTATTR/probability
214echo $times > $FAULTATTR/times
215
216trap "restore_values" SIGINT SIGTERM EXIT
217
218cmd="echo 1 > /proc/self/make-it-fail && exec $@"
219bash -c "$cmd"