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