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