blob: f850ad018b70a89dd00aa1561bd68c746399bc76 [file] [log] [blame]
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -03001===========================================
Akinobu Mitade1ba092006-12-08 02:39:42 -08002Fault injection capabilities infrastructure
3===========================================
4
Masanari Iida1892ce42017-12-23 01:41:21 +09005See also drivers/md/md-faulty.c and "every_nth" module option for scsi_debug.
Akinobu Mitade1ba092006-12-08 02:39:42 -08006
7
8Available fault injection capabilities
9--------------------------------------
10
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030011- failslab
Akinobu Mitade1ba092006-12-08 02:39:42 -080012
13 injects slab allocation failures. (kmalloc(), kmem_cache_alloc(), ...)
14
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030015- fail_page_alloc
Akinobu Mitade1ba092006-12-08 02:39:42 -080016
17 injects page allocation failures. (alloc_pages(), get_free_pages(), ...)
18
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030019- fail_futex
Davidlohr Buesoab51fba2015-06-29 23:26:02 -070020
21 injects futex deadlock and uaddr fault errors.
22
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030023- fail_make_request
Akinobu Mitade1ba092006-12-08 02:39:42 -080024
Don Mullis5d0ffa22006-12-08 02:39:50 -080025 injects disk IO errors on devices permitted by setting
Akinobu Mitade1ba092006-12-08 02:39:42 -080026 /sys/block/<device>/make-it-fail or
Christoph Hellwiged00aab2020-07-01 10:59:44 +020027 /sys/block/<device>/<partition>/make-it-fail. (submit_bio_noacct())
Akinobu Mitade1ba092006-12-08 02:39:42 -080028
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030029- fail_mmc_request
Per Forlin1e4cb222011-08-19 14:52:38 +020030
31 injects MMC data errors on devices permitted by setting
32 debugfs entries under /sys/kernel/debug/mmc0/fail_mmc_request
33
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030034- fail_function
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +090035
36 injects error return on specific functions, which are marked by
37 ALLOW_ERROR_INJECTION() macro, by setting debugfs entries
38 under /sys/kernel/debug/fail_function. No boot option supported.
39
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030040- NVMe fault injection
Thomas Taicf4182f2018-02-08 13:38:30 -050041
42 inject NVMe status code and retry flag on devices permitted by setting
43 debugfs entries under /sys/kernel/debug/nvme*/fault_inject. The default
44 status code is NVME_SC_INVALID_OPCODE with no retry. The status code and
45 retry flag can be set via the debugfs.
46
47
Akinobu Mitade1ba092006-12-08 02:39:42 -080048Configure fault-injection capabilities behavior
49-----------------------------------------------
50
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030051debugfs entries
52^^^^^^^^^^^^^^^
Akinobu Mitade1ba092006-12-08 02:39:42 -080053
54fault-inject-debugfs kernel module provides some debugfs entries for runtime
55configuration of fault-injection capabilities.
56
GeunSik Lim156f5a72009-06-02 15:01:37 +090057- /sys/kernel/debug/fail*/probability:
Akinobu Mitade1ba092006-12-08 02:39:42 -080058
59 likelihood of failure injection, in percent.
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030060
Akinobu Mitade1ba092006-12-08 02:39:42 -080061 Format: <percent>
62
Don Mullis5d0ffa22006-12-08 02:39:50 -080063 Note that one-failure-per-hundred is a very high error rate
64 for some testcases. Consider setting probability=100 and configure
GeunSik Lim156f5a72009-06-02 15:01:37 +090065 /sys/kernel/debug/fail*/interval for such testcases.
Akinobu Mitade1ba092006-12-08 02:39:42 -080066
GeunSik Lim156f5a72009-06-02 15:01:37 +090067- /sys/kernel/debug/fail*/interval:
Akinobu Mitade1ba092006-12-08 02:39:42 -080068
69 specifies the interval between failures, for calls to
70 should_fail() that pass all the other tests.
71
72 Note that if you enable this, by setting interval>1, you will
73 probably want to set probability=100.
74
GeunSik Lim156f5a72009-06-02 15:01:37 +090075- /sys/kernel/debug/fail*/times:
Akinobu Mitade1ba092006-12-08 02:39:42 -080076
77 specifies how many times failures may happen at most.
78 A value of -1 means "no limit".
79
GeunSik Lim156f5a72009-06-02 15:01:37 +090080- /sys/kernel/debug/fail*/space:
Akinobu Mitade1ba092006-12-08 02:39:42 -080081
82 specifies an initial resource "budget", decremented by "size"
83 on each call to should_fail(,size). Failure injection is
84 suppressed until "space" reaches zero.
85
GeunSik Lim156f5a72009-06-02 15:01:37 +090086- /sys/kernel/debug/fail*/verbose
Akinobu Mitade1ba092006-12-08 02:39:42 -080087
88 Format: { 0 | 1 | 2 }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030089
Don Mullis5d0ffa22006-12-08 02:39:50 -080090 specifies the verbosity of the messages when failure is
91 injected. '0' means no messages; '1' will print only a single
92 log line per failure; '2' will print a call trace too -- useful
93 to debug the problems revealed by fault injection.
Akinobu Mitade1ba092006-12-08 02:39:42 -080094
GeunSik Lim156f5a72009-06-02 15:01:37 +090095- /sys/kernel/debug/fail*/task-filter:
Akinobu Mitade1ba092006-12-08 02:39:42 -080096
Don Mullis5d0ffa22006-12-08 02:39:50 -080097 Format: { 'Y' | 'N' }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030098
Don Mullis5d0ffa22006-12-08 02:39:50 -080099 A value of 'N' disables filtering by process (default).
Akinobu Mitade1ba092006-12-08 02:39:42 -0800100 Any positive value limits failures to only processes indicated by
101 /proc/<pid>/make-it-fail==1.
102
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300103- /sys/kernel/debug/fail*/require-start,
104 /sys/kernel/debug/fail*/require-end,
105 /sys/kernel/debug/fail*/reject-start,
106 /sys/kernel/debug/fail*/reject-end:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800107
108 specifies the range of virtual addresses tested during
109 stacktrace walking. Failure is injected only if some caller
Akinobu Mita329409a2006-12-08 02:39:48 -0800110 in the walked stacktrace lies within the required range, and
111 none lies within the rejected range.
112 Default required range is [0,ULONG_MAX) (whole of virtual address space).
113 Default rejected range is [0,0).
Akinobu Mitade1ba092006-12-08 02:39:42 -0800114
GeunSik Lim156f5a72009-06-02 15:01:37 +0900115- /sys/kernel/debug/fail*/stacktrace-depth:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800116
117 specifies the maximum stacktrace depth walked during search
Don Mullis5d0ffa22006-12-08 02:39:50 -0800118 for a caller within [require-start,require-end) OR
119 [reject-start,reject-end).
Akinobu Mitade1ba092006-12-08 02:39:42 -0800120
GeunSik Lim156f5a72009-06-02 15:01:37 +0900121- /sys/kernel/debug/fail_page_alloc/ignore-gfp-highmem:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800122
Don Mullis5d0ffa22006-12-08 02:39:50 -0800123 Format: { 'Y' | 'N' }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300124
Don Mullis5d0ffa22006-12-08 02:39:50 -0800125 default is 'N', setting it to 'Y' won't inject failures into
Akinobu Mitade1ba092006-12-08 02:39:42 -0800126 highmem/user allocations.
127
GeunSik Lim156f5a72009-06-02 15:01:37 +0900128- /sys/kernel/debug/failslab/ignore-gfp-wait:
129- /sys/kernel/debug/fail_page_alloc/ignore-gfp-wait:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800130
Don Mullis5d0ffa22006-12-08 02:39:50 -0800131 Format: { 'Y' | 'N' }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300132
Don Mullis5d0ffa22006-12-08 02:39:50 -0800133 default is 'N', setting it to 'Y' will inject failures
Akinobu Mitade1ba092006-12-08 02:39:42 -0800134 only into non-sleep allocations (GFP_ATOMIC allocations).
135
GeunSik Lim156f5a72009-06-02 15:01:37 +0900136- /sys/kernel/debug/fail_page_alloc/min-order:
Akinobu Mita54114992007-07-15 23:40:23 -0700137
138 specifies the minimum page allocation order to be injected
139 failures.
140
Davidlohr Buesoab51fba2015-06-29 23:26:02 -0700141- /sys/kernel/debug/fail_futex/ignore-private:
142
143 Format: { 'Y' | 'N' }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300144
Davidlohr Buesoab51fba2015-06-29 23:26:02 -0700145 default is 'N', setting it to 'Y' will disable failure injections
146 when dealing with private (address space) futexes.
147
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900148- /sys/kernel/debug/fail_function/inject:
149
150 Format: { 'function-name' | '!function-name' | '' }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300151
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900152 specifies the target function of error injection by name.
153 If the function name leads '!' prefix, given function is
154 removed from injection list. If nothing specified ('')
155 injection list is cleared.
156
157- /sys/kernel/debug/fail_function/injectable:
158
159 (read only) shows error injectable functions and what type of
160 error values can be specified. The error type will be one of
161 below;
162 - NULL: retval must be 0.
163 - ERRNO: retval must be -1 to -MAX_ERRNO (-4096).
164 - ERR_NULL: retval must be 0 or -1 to -MAX_ERRNO (-4096).
165
166- /sys/kernel/debug/fail_function/<functiuon-name>/retval:
167
168 specifies the "error" return value to inject to the given
169 function for given function. This will be created when
170 user specifies new injection entry.
171
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300172Boot option
173^^^^^^^^^^^
Akinobu Mitade1ba092006-12-08 02:39:42 -0800174
175In order to inject faults while debugfs is not available (early boot time),
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300176use the boot option::
Akinobu Mitade1ba092006-12-08 02:39:42 -0800177
178 failslab=
179 fail_page_alloc=
Per Forlin1e4cb222011-08-19 14:52:38 +0200180 fail_make_request=
Davidlohr Buesoab51fba2015-06-29 23:26:02 -0700181 fail_futex=
Per Forlin199e3f42011-09-13 23:03:30 +0200182 mmc_core.fail_request=<interval>,<probability>,<space>,<times>
Akinobu Mitade1ba092006-12-08 02:39:42 -0800183
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300184proc entries
185^^^^^^^^^^^^
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700186
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300187- /proc/<pid>/fail-nth,
188 /proc/self/task/<tid>/fail-nth:
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700189
Akinobu Mita9049f2f2017-07-14 14:49:52 -0700190 Write to this file of integer N makes N-th call in the task fail.
Akinobu Mitabfc74092017-07-14 14:49:54 -0700191 Read from this file returns a integer value. A value of '0' indicates
192 that the fault setup with a previous write to this file was injected.
193 A positive integer N indicates that the fault wasn't yet injected.
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700194 Note that this file enables all types of faults (slab, futex, etc).
195 This setting takes precedence over all other generic debugfs settings
196 like probability, interval, times, etc. But per-capability settings
197 (e.g. fail_futex/ignore-private) take precedence over it.
198
199 This feature is intended for systematic testing of faults in a single
200 system call. See an example below.
201
Akinobu Mitade1ba092006-12-08 02:39:42 -0800202How to add new fault injection capability
203-----------------------------------------
204
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300205- #include <linux/fault-inject.h>
Akinobu Mitade1ba092006-12-08 02:39:42 -0800206
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300207- define the fault attributes
Akinobu Mitade1ba092006-12-08 02:39:42 -0800208
Laurent Gauthier2d879482019-01-05 00:08:34 +0100209 DECLARE_FAULT_ATTR(name);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800210
211 Please see the definition of struct fault_attr in fault-inject.h
212 for details.
213
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300214- provide a way to configure fault attributes
Akinobu Mitade1ba092006-12-08 02:39:42 -0800215
216- boot option
217
218 If you need to enable the fault injection capability from boot time, you can
Don Mullis5d0ffa22006-12-08 02:39:50 -0800219 provide boot option to configure it. There is a helper function for it:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800220
Don Mullis5d0ffa22006-12-08 02:39:50 -0800221 setup_fault_attr(attr, str);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800222
223- debugfs entries
224
225 failslab, fail_page_alloc, and fail_make_request use this way.
Don Mullis5d0ffa22006-12-08 02:39:50 -0800226 Helper functions:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800227
Akinobu Mitadd48c082011-08-03 16:21:01 -0700228 fault_create_debugfs_attr(name, parent, attr);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800229
230- module parameters
231
232 If the scope of the fault injection capability is limited to a
233 single kernel module, it is better to provide module parameters to
234 configure the fault attributes.
235
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300236- add a hook to insert failures
Akinobu Mitade1ba092006-12-08 02:39:42 -0800237
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300238 Upon should_fail() returning true, client code should inject a failure:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800239
Don Mullis5d0ffa22006-12-08 02:39:50 -0800240 should_fail(attr, size);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800241
242Application Examples
243--------------------
244
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300245- Inject slab allocation failures into module init/exit code::
Akinobu Mitade1ba092006-12-08 02:39:42 -0800246
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300247 #!/bin/bash
Akinobu Mitade1ba092006-12-08 02:39:42 -0800248
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300249 FAILTYPE=failslab
250 echo Y > /sys/kernel/debug/$FAILTYPE/task-filter
251 echo 10 > /sys/kernel/debug/$FAILTYPE/probability
252 echo 100 > /sys/kernel/debug/$FAILTYPE/interval
253 echo -1 > /sys/kernel/debug/$FAILTYPE/times
254 echo 0 > /sys/kernel/debug/$FAILTYPE/space
255 echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
256 echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
Akinobu Mitade1ba092006-12-08 02:39:42 -0800257
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300258 faulty_system()
259 {
Akinobu Mita18584872007-07-15 23:40:24 -0700260 bash -c "echo 1 > /proc/self/make-it-fail && exec $*"
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300261 }
Akinobu Mitade1ba092006-12-08 02:39:42 -0800262
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300263 if [ $# -eq 0 ]
264 then
Akinobu Mita18584872007-07-15 23:40:24 -0700265 echo "Usage: $0 modulename [ modulename ... ]"
266 exit 1
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300267 fi
Akinobu Mitade1ba092006-12-08 02:39:42 -0800268
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300269 for m in $*
270 do
Akinobu Mita18584872007-07-15 23:40:24 -0700271 echo inserting $m...
272 faulty_system modprobe $m
Akinobu Mitade1ba092006-12-08 02:39:42 -0800273
Akinobu Mita18584872007-07-15 23:40:24 -0700274 echo removing $m...
275 faulty_system modprobe -r $m
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300276 done
Akinobu Mitade1ba092006-12-08 02:39:42 -0800277
278------------------------------------------------------------------------------
279
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300280- Inject page allocation failures only for a specific module::
Akinobu Mitade1ba092006-12-08 02:39:42 -0800281
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300282 #!/bin/bash
Akinobu Mitade1ba092006-12-08 02:39:42 -0800283
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300284 FAILTYPE=fail_page_alloc
285 module=$1
Akinobu Mitade1ba092006-12-08 02:39:42 -0800286
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300287 if [ -z $module ]
288 then
Akinobu Mita18584872007-07-15 23:40:24 -0700289 echo "Usage: $0 <modulename>"
290 exit 1
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300291 fi
Akinobu Mitade1ba092006-12-08 02:39:42 -0800292
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300293 modprobe $module
Akinobu Mitade1ba092006-12-08 02:39:42 -0800294
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300295 if [ ! -d /sys/module/$module/sections ]
296 then
Akinobu Mita18584872007-07-15 23:40:24 -0700297 echo Module $module is not loaded
298 exit 1
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300299 fi
Akinobu Mita18584872007-07-15 23:40:24 -0700300
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300301 cat /sys/module/$module/sections/.text > /sys/kernel/debug/$FAILTYPE/require-start
302 cat /sys/module/$module/sections/.data > /sys/kernel/debug/$FAILTYPE/require-end
Akinobu Mita18584872007-07-15 23:40:24 -0700303
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300304 echo N > /sys/kernel/debug/$FAILTYPE/task-filter
305 echo 10 > /sys/kernel/debug/$FAILTYPE/probability
306 echo 100 > /sys/kernel/debug/$FAILTYPE/interval
307 echo -1 > /sys/kernel/debug/$FAILTYPE/times
308 echo 0 > /sys/kernel/debug/$FAILTYPE/space
309 echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
310 echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
311 echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-highmem
312 echo 10 > /sys/kernel/debug/$FAILTYPE/stacktrace-depth
Akinobu Mita18584872007-07-15 23:40:24 -0700313
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300314 trap "echo 0 > /sys/kernel/debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
Akinobu Mita18584872007-07-15 23:40:24 -0700315
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300316 echo "Injecting errors into the module $module... (interrupt to stop)"
317 sleep 1000000
Akinobu Mitade1ba092006-12-08 02:39:42 -0800318
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900319------------------------------------------------------------------------------
320
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300321- Inject open_ctree error while btrfs mount::
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900322
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300323 #!/bin/bash
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900324
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300325 rm -f testfile.img
326 dd if=/dev/zero of=testfile.img bs=1M seek=1000 count=1
327 DEVICE=$(losetup --show -f testfile.img)
328 mkfs.btrfs -f $DEVICE
329 mkdir -p tmpmnt
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900330
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300331 FAILTYPE=fail_function
332 FAILFUNC=open_ctree
333 echo $FAILFUNC > /sys/kernel/debug/$FAILTYPE/inject
334 echo -12 > /sys/kernel/debug/$FAILTYPE/$FAILFUNC/retval
335 echo N > /sys/kernel/debug/$FAILTYPE/task-filter
336 echo 100 > /sys/kernel/debug/$FAILTYPE/probability
337 echo 0 > /sys/kernel/debug/$FAILTYPE/interval
338 echo -1 > /sys/kernel/debug/$FAILTYPE/times
339 echo 0 > /sys/kernel/debug/$FAILTYPE/space
340 echo 1 > /sys/kernel/debug/$FAILTYPE/verbose
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900341
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300342 mount -t btrfs $DEVICE tmpmnt
343 if [ $? -ne 0 ]
344 then
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900345 echo "SUCCESS!"
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300346 else
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900347 echo "FAILED!"
348 umount tmpmnt
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300349 fi
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900350
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300351 echo > /sys/kernel/debug/$FAILTYPE/inject
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900352
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300353 rmdir tmpmnt
354 losetup -d $DEVICE
355 rm testfile.img
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900356
357
Akinobu Mitac24aa642012-07-30 14:43:20 -0700358Tool to run command with failslab or fail_page_alloc
359----------------------------------------------------
360In order to make it easier to accomplish the tasks mentioned above, we can use
361tools/testing/fault-injection/failcmd.sh. Please run a command
362"./tools/testing/fault-injection/failcmd.sh --help" for more information and
363see the following examples.
364
365Examples:
366
367Run a command "make -C tools/testing/selftests/ run_tests" with injecting slab
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300368allocation failure::
Akinobu Mitac24aa642012-07-30 14:43:20 -0700369
370 # ./tools/testing/fault-injection/failcmd.sh \
371 -- make -C tools/testing/selftests/ run_tests
372
373Same as above except to specify 100 times failures at most instead of one time
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300374at most by default::
Akinobu Mitac24aa642012-07-30 14:43:20 -0700375
376 # ./tools/testing/fault-injection/failcmd.sh --times=100 \
377 -- make -C tools/testing/selftests/ run_tests
378
379Same as above except to inject page allocation failure instead of slab
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300380allocation failure::
Akinobu Mitac24aa642012-07-30 14:43:20 -0700381
382 # env FAILCMD_TYPE=fail_page_alloc \
383 ./tools/testing/fault-injection/failcmd.sh --times=100 \
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300384 -- make -C tools/testing/selftests/ run_tests
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700385
386Systematic faults using fail-nth
387---------------------------------
388
389The following code systematically faults 0-th, 1-st, 2-nd and so on
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300390capabilities in the socketpair() system call::
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700391
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300392 #include <sys/types.h>
393 #include <sys/stat.h>
394 #include <sys/socket.h>
395 #include <sys/syscall.h>
396 #include <fcntl.h>
397 #include <unistd.h>
398 #include <string.h>
399 #include <stdlib.h>
400 #include <stdio.h>
401 #include <errno.h>
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700402
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300403 int main()
404 {
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700405 int i, err, res, fail_nth, fds[2];
406 char buf[128];
407
408 system("echo N > /sys/kernel/debug/failslab/ignore-gfp-wait");
409 sprintf(buf, "/proc/self/task/%ld/fail-nth", syscall(SYS_gettid));
410 fail_nth = open(buf, O_RDWR);
Akinobu Mita9049f2f2017-07-14 14:49:52 -0700411 for (i = 1;; i++) {
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700412 sprintf(buf, "%d", i);
413 write(fail_nth, buf, strlen(buf));
414 res = socketpair(AF_LOCAL, SOCK_STREAM, 0, fds);
415 err = errno;
Akinobu Mitabfc74092017-07-14 14:49:54 -0700416 pread(fail_nth, buf, sizeof(buf), 0);
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700417 if (res == 0) {
418 close(fds[0]);
419 close(fds[1]);
420 }
Akinobu Mitabfc74092017-07-14 14:49:54 -0700421 printf("%d-th fault %c: res=%d/%d\n", i, atoi(buf) ? 'N' : 'Y',
422 res, err);
423 if (atoi(buf))
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700424 break;
425 }
426 return 0;
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300427 }
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700428
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300429An example output::
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700430
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300431 1-th fault Y: res=-1/23
432 2-th fault Y: res=-1/23
433 3-th fault Y: res=-1/12
434 4-th fault Y: res=-1/12
435 5-th fault Y: res=-1/23
436 6-th fault Y: res=-1/23
437 7-th fault Y: res=-1/23
438 8-th fault Y: res=-1/12
439 9-th fault Y: res=-1/12
440 10-th fault Y: res=-1/12
441 11-th fault Y: res=-1/12
442 12-th fault Y: res=-1/12
443 13-th fault Y: res=-1/12
444 14-th fault Y: res=-1/12
445 15-th fault Y: res=-1/12
446 16-th fault N: res=0/12