blob: b7ca560b93407ca94848ced9304a52b2365c9559 [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
18o fail_make_request
19
Don Mullis5d0ffa22006-12-08 02:39:50 -080020 injects disk IO errors on devices permitted by setting
Akinobu Mitade1ba092006-12-08 02:39:42 -080021 /sys/block/<device>/make-it-fail or
22 /sys/block/<device>/<partition>/make-it-fail. (generic_make_request())
23
24Configure fault-injection capabilities behavior
25-----------------------------------------------
26
27o debugfs entries
28
29fault-inject-debugfs kernel module provides some debugfs entries for runtime
30configuration of fault-injection capabilities.
31
Don Mullis5d0ffa22006-12-08 02:39:50 -080032- /debug/fail*/probability:
Akinobu Mitade1ba092006-12-08 02:39:42 -080033
34 likelihood of failure injection, in percent.
35 Format: <percent>
36
Don Mullis5d0ffa22006-12-08 02:39:50 -080037 Note that one-failure-per-hundred is a very high error rate
38 for some testcases. Consider setting probability=100 and configure
39 /debug/fail*/interval for such testcases.
Akinobu Mitade1ba092006-12-08 02:39:42 -080040
Don Mullis5d0ffa22006-12-08 02:39:50 -080041- /debug/fail*/interval:
Akinobu Mitade1ba092006-12-08 02:39:42 -080042
43 specifies the interval between failures, for calls to
44 should_fail() that pass all the other tests.
45
46 Note that if you enable this, by setting interval>1, you will
47 probably want to set probability=100.
48
Don Mullis5d0ffa22006-12-08 02:39:50 -080049- /debug/fail*/times:
Akinobu Mitade1ba092006-12-08 02:39:42 -080050
51 specifies how many times failures may happen at most.
52 A value of -1 means "no limit".
53
Don Mullis5d0ffa22006-12-08 02:39:50 -080054- /debug/fail*/space:
Akinobu Mitade1ba092006-12-08 02:39:42 -080055
56 specifies an initial resource "budget", decremented by "size"
57 on each call to should_fail(,size). Failure injection is
58 suppressed until "space" reaches zero.
59
Don Mullis5d0ffa22006-12-08 02:39:50 -080060- /debug/fail*/verbose
Akinobu Mitade1ba092006-12-08 02:39:42 -080061
62 Format: { 0 | 1 | 2 }
Don Mullis5d0ffa22006-12-08 02:39:50 -080063 specifies the verbosity of the messages when failure is
64 injected. '0' means no messages; '1' will print only a single
65 log line per failure; '2' will print a call trace too -- useful
66 to debug the problems revealed by fault injection.
Akinobu Mitade1ba092006-12-08 02:39:42 -080067
Don Mullis5d0ffa22006-12-08 02:39:50 -080068- /debug/fail*/task-filter:
Akinobu Mitade1ba092006-12-08 02:39:42 -080069
Don Mullis5d0ffa22006-12-08 02:39:50 -080070 Format: { 'Y' | 'N' }
71 A value of 'N' disables filtering by process (default).
Akinobu Mitade1ba092006-12-08 02:39:42 -080072 Any positive value limits failures to only processes indicated by
73 /proc/<pid>/make-it-fail==1.
74
Don Mullis5d0ffa22006-12-08 02:39:50 -080075- /debug/fail*/require-start:
76- /debug/fail*/require-end:
77- /debug/fail*/reject-start:
78- /debug/fail*/reject-end:
Akinobu Mitade1ba092006-12-08 02:39:42 -080079
80 specifies the range of virtual addresses tested during
81 stacktrace walking. Failure is injected only if some caller
Akinobu Mita329409a2006-12-08 02:39:48 -080082 in the walked stacktrace lies within the required range, and
83 none lies within the rejected range.
84 Default required range is [0,ULONG_MAX) (whole of virtual address space).
85 Default rejected range is [0,0).
Akinobu Mitade1ba092006-12-08 02:39:42 -080086
Don Mullis5d0ffa22006-12-08 02:39:50 -080087- /debug/fail*/stacktrace-depth:
Akinobu Mitade1ba092006-12-08 02:39:42 -080088
89 specifies the maximum stacktrace depth walked during search
Don Mullis5d0ffa22006-12-08 02:39:50 -080090 for a caller within [require-start,require-end) OR
91 [reject-start,reject-end).
Akinobu Mitade1ba092006-12-08 02:39:42 -080092
Akinobu Mitade1ba092006-12-08 02:39:42 -080093- /debug/fail_page_alloc/ignore-gfp-highmem:
94
Don Mullis5d0ffa22006-12-08 02:39:50 -080095 Format: { 'Y' | 'N' }
96 default is 'N', setting it to 'Y' won't inject failures into
Akinobu Mitade1ba092006-12-08 02:39:42 -080097 highmem/user allocations.
98
99- /debug/failslab/ignore-gfp-wait:
100- /debug/fail_page_alloc/ignore-gfp-wait:
101
Don Mullis5d0ffa22006-12-08 02:39:50 -0800102 Format: { 'Y' | 'N' }
103 default is 'N', setting it to 'Y' will inject failures
Akinobu Mitade1ba092006-12-08 02:39:42 -0800104 only into non-sleep allocations (GFP_ATOMIC allocations).
105
106o Boot option
107
108In order to inject faults while debugfs is not available (early boot time),
109use the boot option:
110
111 failslab=
112 fail_page_alloc=
113 fail_make_request=<interval>,<probability>,<space>,<times>
114
115How to add new fault injection capability
116-----------------------------------------
117
118o #include <linux/fault-inject.h>
119
120o define the fault attributes
121
122 DECLARE_FAULT_INJECTION(name);
123
124 Please see the definition of struct fault_attr in fault-inject.h
125 for details.
126
Don Mullis5d0ffa22006-12-08 02:39:50 -0800127o provide a way to configure fault attributes
Akinobu Mitade1ba092006-12-08 02:39:42 -0800128
129- boot option
130
131 If you need to enable the fault injection capability from boot time, you can
Don Mullis5d0ffa22006-12-08 02:39:50 -0800132 provide boot option to configure it. There is a helper function for it:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800133
Don Mullis5d0ffa22006-12-08 02:39:50 -0800134 setup_fault_attr(attr, str);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800135
136- debugfs entries
137
138 failslab, fail_page_alloc, and fail_make_request use this way.
Don Mullis5d0ffa22006-12-08 02:39:50 -0800139 Helper functions:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800140
Don Mullis5d0ffa22006-12-08 02:39:50 -0800141 init_fault_attr_entries(entries, attr, name);
142 void cleanup_fault_attr_entries(entries);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800143
144- module parameters
145
146 If the scope of the fault injection capability is limited to a
147 single kernel module, it is better to provide module parameters to
148 configure the fault attributes.
149
150o add a hook to insert failures
151
Don Mullis5d0ffa22006-12-08 02:39:50 -0800152 Upon should_fail() returning true, client code should inject a failure.
Akinobu Mitade1ba092006-12-08 02:39:42 -0800153
Don Mullis5d0ffa22006-12-08 02:39:50 -0800154 should_fail(attr, size);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800155
156Application Examples
157--------------------
158
159o inject slab allocation failures into module init/cleanup code
160
161------------------------------------------------------------------------------
162#!/bin/bash
163
164FAILCMD=Documentation/fault-injection/failcmd.sh
165BLACKLIST="root_plug evbug"
166
167FAILNAME=failslab
168echo Y > /debug/$FAILNAME/task-filter
169echo 10 > /debug/$FAILNAME/probability
170echo 100 > /debug/$FAILNAME/interval
171echo -1 > /debug/$FAILNAME/times
172echo 2 > /debug/$FAILNAME/verbose
Akinobu Mitade1ba092006-12-08 02:39:42 -0800173echo 1 > /debug/$FAILNAME/ignore-gfp-wait
174
175blacklist()
176{
177 echo $BLACKLIST | grep $1 > /dev/null 2>&1
178}
179
180oops()
181{
182 dmesg | grep BUG > /dev/null 2>&1
183}
184
185find /lib/modules/`uname -r` -name '*.ko' -exec basename {} .ko \; |
186 while read i
187 do
188 oops && exit 1
189
190 if ! blacklist $i
191 then
192 echo inserting $i...
193 bash $FAILCMD modprobe $i
194 fi
195 done
196
197lsmod | awk '{ if ($3 == 0) { print $1 } }' |
198 while read i
199 do
200 oops && exit 1
201
202 if ! blacklist $i
203 then
204 echo removing $i...
205 bash $FAILCMD modprobe -r $i
206 fi
207 done
208
209------------------------------------------------------------------------------
210
211o inject slab allocation failures only for a specific module
212
213------------------------------------------------------------------------------
214#!/bin/bash
215
216FAILMOD=Documentation/fault-injection/failmodule.sh
217
218echo injecting errors into the module $1...
219
220modprobe $1
221bash $FAILMOD failslab $1 10
222echo 25 > /debug/failslab/probability
223
224------------------------------------------------------------------------------
225