blob: 415484f3d59a248f587a9d92a315fc373c8b15f5 [file] [log] [blame]
Akinobu Mitade1ba092006-12-08 02:39:42 -08001Fault injection capabilities infrastructure
2===========================================
3
4See also drivers/md/faulty.c and "every_nth" module option for scsi_debug.
5
6
7Available fault injection capabilities
8--------------------------------------
9
10o failslab
11
12 injects slab allocation failures. (kmalloc(), kmem_cache_alloc(), ...)
13
14o fail_page_alloc
15
16 injects page allocation failures. (alloc_pages(), get_free_pages(), ...)
17
Davidlohr Buesoab51fba2015-06-29 23:26:02 -070018o fail_futex
19
20 injects futex deadlock and uaddr fault errors.
21
Akinobu Mitade1ba092006-12-08 02:39:42 -080022o fail_make_request
23
Don Mullis5d0ffa22006-12-08 02:39:50 -080024 injects disk IO errors on devices permitted by setting
Akinobu Mitade1ba092006-12-08 02:39:42 -080025 /sys/block/<device>/make-it-fail or
26 /sys/block/<device>/<partition>/make-it-fail. (generic_make_request())
27
Per Forlin1e4cb222011-08-19 14:52:38 +020028o fail_mmc_request
29
30 injects MMC data errors on devices permitted by setting
31 debugfs entries under /sys/kernel/debug/mmc0/fail_mmc_request
32
Akinobu Mitade1ba092006-12-08 02:39:42 -080033Configure fault-injection capabilities behavior
34-----------------------------------------------
35
36o debugfs entries
37
38fault-inject-debugfs kernel module provides some debugfs entries for runtime
39configuration of fault-injection capabilities.
40
GeunSik Lim156f5a72009-06-02 15:01:37 +090041- /sys/kernel/debug/fail*/probability:
Akinobu Mitade1ba092006-12-08 02:39:42 -080042
43 likelihood of failure injection, in percent.
44 Format: <percent>
45
Don Mullis5d0ffa22006-12-08 02:39:50 -080046 Note that one-failure-per-hundred is a very high error rate
47 for some testcases. Consider setting probability=100 and configure
GeunSik Lim156f5a72009-06-02 15:01:37 +090048 /sys/kernel/debug/fail*/interval for such testcases.
Akinobu Mitade1ba092006-12-08 02:39:42 -080049
GeunSik Lim156f5a72009-06-02 15:01:37 +090050- /sys/kernel/debug/fail*/interval:
Akinobu Mitade1ba092006-12-08 02:39:42 -080051
52 specifies the interval between failures, for calls to
53 should_fail() that pass all the other tests.
54
55 Note that if you enable this, by setting interval>1, you will
56 probably want to set probability=100.
57
GeunSik Lim156f5a72009-06-02 15:01:37 +090058- /sys/kernel/debug/fail*/times:
Akinobu Mitade1ba092006-12-08 02:39:42 -080059
60 specifies how many times failures may happen at most.
61 A value of -1 means "no limit".
62
GeunSik Lim156f5a72009-06-02 15:01:37 +090063- /sys/kernel/debug/fail*/space:
Akinobu Mitade1ba092006-12-08 02:39:42 -080064
65 specifies an initial resource "budget", decremented by "size"
66 on each call to should_fail(,size). Failure injection is
67 suppressed until "space" reaches zero.
68
GeunSik Lim156f5a72009-06-02 15:01:37 +090069- /sys/kernel/debug/fail*/verbose
Akinobu Mitade1ba092006-12-08 02:39:42 -080070
71 Format: { 0 | 1 | 2 }
Don Mullis5d0ffa22006-12-08 02:39:50 -080072 specifies the verbosity of the messages when failure is
73 injected. '0' means no messages; '1' will print only a single
74 log line per failure; '2' will print a call trace too -- useful
75 to debug the problems revealed by fault injection.
Akinobu Mitade1ba092006-12-08 02:39:42 -080076
GeunSik Lim156f5a72009-06-02 15:01:37 +090077- /sys/kernel/debug/fail*/task-filter:
Akinobu Mitade1ba092006-12-08 02:39:42 -080078
Don Mullis5d0ffa22006-12-08 02:39:50 -080079 Format: { 'Y' | 'N' }
80 A value of 'N' disables filtering by process (default).
Akinobu Mitade1ba092006-12-08 02:39:42 -080081 Any positive value limits failures to only processes indicated by
82 /proc/<pid>/make-it-fail==1.
83
GeunSik Lim156f5a72009-06-02 15:01:37 +090084- /sys/kernel/debug/fail*/require-start:
85- /sys/kernel/debug/fail*/require-end:
86- /sys/kernel/debug/fail*/reject-start:
87- /sys/kernel/debug/fail*/reject-end:
Akinobu Mitade1ba092006-12-08 02:39:42 -080088
89 specifies the range of virtual addresses tested during
90 stacktrace walking. Failure is injected only if some caller
Akinobu Mita329409a2006-12-08 02:39:48 -080091 in the walked stacktrace lies within the required range, and
92 none lies within the rejected range.
93 Default required range is [0,ULONG_MAX) (whole of virtual address space).
94 Default rejected range is [0,0).
Akinobu Mitade1ba092006-12-08 02:39:42 -080095
GeunSik Lim156f5a72009-06-02 15:01:37 +090096- /sys/kernel/debug/fail*/stacktrace-depth:
Akinobu Mitade1ba092006-12-08 02:39:42 -080097
98 specifies the maximum stacktrace depth walked during search
Don Mullis5d0ffa22006-12-08 02:39:50 -080099 for a caller within [require-start,require-end) OR
100 [reject-start,reject-end).
Akinobu Mitade1ba092006-12-08 02:39:42 -0800101
GeunSik Lim156f5a72009-06-02 15:01:37 +0900102- /sys/kernel/debug/fail_page_alloc/ignore-gfp-highmem:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800103
Don Mullis5d0ffa22006-12-08 02:39:50 -0800104 Format: { 'Y' | 'N' }
105 default is 'N', setting it to 'Y' won't inject failures into
Akinobu Mitade1ba092006-12-08 02:39:42 -0800106 highmem/user allocations.
107
GeunSik Lim156f5a72009-06-02 15:01:37 +0900108- /sys/kernel/debug/failslab/ignore-gfp-wait:
109- /sys/kernel/debug/fail_page_alloc/ignore-gfp-wait:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800110
Don Mullis5d0ffa22006-12-08 02:39:50 -0800111 Format: { 'Y' | 'N' }
112 default is 'N', setting it to 'Y' will inject failures
Akinobu Mitade1ba092006-12-08 02:39:42 -0800113 only into non-sleep allocations (GFP_ATOMIC allocations).
114
GeunSik Lim156f5a72009-06-02 15:01:37 +0900115- /sys/kernel/debug/fail_page_alloc/min-order:
Akinobu Mita54114992007-07-15 23:40:23 -0700116
117 specifies the minimum page allocation order to be injected
118 failures.
119
Davidlohr Buesoab51fba2015-06-29 23:26:02 -0700120- /sys/kernel/debug/fail_futex/ignore-private:
121
122 Format: { 'Y' | 'N' }
123 default is 'N', setting it to 'Y' will disable failure injections
124 when dealing with private (address space) futexes.
125
Akinobu Mitade1ba092006-12-08 02:39:42 -0800126o Boot option
127
128In order to inject faults while debugfs is not available (early boot time),
129use the boot option:
130
131 failslab=
132 fail_page_alloc=
Per Forlin1e4cb222011-08-19 14:52:38 +0200133 fail_make_request=
Davidlohr Buesoab51fba2015-06-29 23:26:02 -0700134 fail_futex=
Per Forlin199e3f42011-09-13 23:03:30 +0200135 mmc_core.fail_request=<interval>,<probability>,<space>,<times>
Akinobu Mitade1ba092006-12-08 02:39:42 -0800136
137How to add new fault injection capability
138-----------------------------------------
139
140o #include <linux/fault-inject.h>
141
142o define the fault attributes
143
144 DECLARE_FAULT_INJECTION(name);
145
146 Please see the definition of struct fault_attr in fault-inject.h
147 for details.
148
Don Mullis5d0ffa22006-12-08 02:39:50 -0800149o provide a way to configure fault attributes
Akinobu Mitade1ba092006-12-08 02:39:42 -0800150
151- boot option
152
153 If you need to enable the fault injection capability from boot time, you can
Don Mullis5d0ffa22006-12-08 02:39:50 -0800154 provide boot option to configure it. There is a helper function for it:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800155
Don Mullis5d0ffa22006-12-08 02:39:50 -0800156 setup_fault_attr(attr, str);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800157
158- debugfs entries
159
160 failslab, fail_page_alloc, and fail_make_request use this way.
Don Mullis5d0ffa22006-12-08 02:39:50 -0800161 Helper functions:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800162
Akinobu Mitadd48c082011-08-03 16:21:01 -0700163 fault_create_debugfs_attr(name, parent, attr);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800164
165- module parameters
166
167 If the scope of the fault injection capability is limited to a
168 single kernel module, it is better to provide module parameters to
169 configure the fault attributes.
170
171o add a hook to insert failures
172
Don Mullis5d0ffa22006-12-08 02:39:50 -0800173 Upon should_fail() returning true, client code should inject a failure.
Akinobu Mitade1ba092006-12-08 02:39:42 -0800174
Don Mullis5d0ffa22006-12-08 02:39:50 -0800175 should_fail(attr, size);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800176
177Application Examples
178--------------------
179
Akinobu Mita18584872007-07-15 23:40:24 -0700180o Inject slab allocation failures into module init/exit code
Akinobu Mitade1ba092006-12-08 02:39:42 -0800181
Akinobu Mitade1ba092006-12-08 02:39:42 -0800182#!/bin/bash
183
Akinobu Mita18584872007-07-15 23:40:24 -0700184FAILTYPE=failslab
GeunSik Lim156f5a72009-06-02 15:01:37 +0900185echo Y > /sys/kernel/debug/$FAILTYPE/task-filter
186echo 10 > /sys/kernel/debug/$FAILTYPE/probability
187echo 100 > /sys/kernel/debug/$FAILTYPE/interval
188echo -1 > /sys/kernel/debug/$FAILTYPE/times
189echo 0 > /sys/kernel/debug/$FAILTYPE/space
190echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
191echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
Akinobu Mitade1ba092006-12-08 02:39:42 -0800192
Akinobu Mita18584872007-07-15 23:40:24 -0700193faulty_system()
Akinobu Mitade1ba092006-12-08 02:39:42 -0800194{
Akinobu Mita18584872007-07-15 23:40:24 -0700195 bash -c "echo 1 > /proc/self/make-it-fail && exec $*"
Akinobu Mitade1ba092006-12-08 02:39:42 -0800196}
197
Akinobu Mita18584872007-07-15 23:40:24 -0700198if [ $# -eq 0 ]
199then
200 echo "Usage: $0 modulename [ modulename ... ]"
201 exit 1
202fi
Akinobu Mitade1ba092006-12-08 02:39:42 -0800203
Akinobu Mita18584872007-07-15 23:40:24 -0700204for m in $*
205do
206 echo inserting $m...
207 faulty_system modprobe $m
Akinobu Mitade1ba092006-12-08 02:39:42 -0800208
Akinobu Mita18584872007-07-15 23:40:24 -0700209 echo removing $m...
210 faulty_system modprobe -r $m
211done
Akinobu Mitade1ba092006-12-08 02:39:42 -0800212
213------------------------------------------------------------------------------
214
Akinobu Mita18584872007-07-15 23:40:24 -0700215o Inject page allocation failures only for a specific module
Akinobu Mitade1ba092006-12-08 02:39:42 -0800216
Akinobu Mitade1ba092006-12-08 02:39:42 -0800217#!/bin/bash
218
Akinobu Mita18584872007-07-15 23:40:24 -0700219FAILTYPE=fail_page_alloc
220module=$1
Akinobu Mitade1ba092006-12-08 02:39:42 -0800221
Akinobu Mita18584872007-07-15 23:40:24 -0700222if [ -z $module ]
223then
224 echo "Usage: $0 <modulename>"
225 exit 1
226fi
Akinobu Mitade1ba092006-12-08 02:39:42 -0800227
Akinobu Mita18584872007-07-15 23:40:24 -0700228modprobe $module
Akinobu Mitade1ba092006-12-08 02:39:42 -0800229
Akinobu Mita18584872007-07-15 23:40:24 -0700230if [ ! -d /sys/module/$module/sections ]
231then
232 echo Module $module is not loaded
233 exit 1
234fi
235
GeunSik Lim156f5a72009-06-02 15:01:37 +0900236cat /sys/module/$module/sections/.text > /sys/kernel/debug/$FAILTYPE/require-start
237cat /sys/module/$module/sections/.data > /sys/kernel/debug/$FAILTYPE/require-end
Akinobu Mita18584872007-07-15 23:40:24 -0700238
GeunSik Lim156f5a72009-06-02 15:01:37 +0900239echo N > /sys/kernel/debug/$FAILTYPE/task-filter
240echo 10 > /sys/kernel/debug/$FAILTYPE/probability
241echo 100 > /sys/kernel/debug/$FAILTYPE/interval
242echo -1 > /sys/kernel/debug/$FAILTYPE/times
243echo 0 > /sys/kernel/debug/$FAILTYPE/space
244echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
245echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
246echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-highmem
247echo 10 > /sys/kernel/debug/$FAILTYPE/stacktrace-depth
Akinobu Mita18584872007-07-15 23:40:24 -0700248
GeunSik Lim156f5a72009-06-02 15:01:37 +0900249trap "echo 0 > /sys/kernel/debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
Akinobu Mita18584872007-07-15 23:40:24 -0700250
251echo "Injecting errors into the module $module... (interrupt to stop)"
252sleep 1000000
Akinobu Mitade1ba092006-12-08 02:39:42 -0800253
Akinobu Mitac24aa642012-07-30 14:43:20 -0700254Tool to run command with failslab or fail_page_alloc
255----------------------------------------------------
256In order to make it easier to accomplish the tasks mentioned above, we can use
257tools/testing/fault-injection/failcmd.sh. Please run a command
258"./tools/testing/fault-injection/failcmd.sh --help" for more information and
259see the following examples.
260
261Examples:
262
263Run a command "make -C tools/testing/selftests/ run_tests" with injecting slab
264allocation failure.
265
266 # ./tools/testing/fault-injection/failcmd.sh \
267 -- make -C tools/testing/selftests/ run_tests
268
269Same as above except to specify 100 times failures at most instead of one time
270at most by default.
271
272 # ./tools/testing/fault-injection/failcmd.sh --times=100 \
273 -- make -C tools/testing/selftests/ run_tests
274
275Same as above except to inject page allocation failure instead of slab
276allocation failure.
277
278 # env FAILCMD_TYPE=fail_page_alloc \
279 ./tools/testing/fault-injection/failcmd.sh --times=100 \
280 -- make -C tools/testing/selftests/ run_tests