~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/fault-injection/fault-injection.rst

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 ===========================================
  2 Fault injection capabilities infrastructure
  3 ===========================================
  4 
  5 See also drivers/md/md-faulty.c and "every_nth" module option for scsi_debug.
  6 
  7 
  8 Available fault injection capabilities
  9 --------------------------------------
 10 
 11 - failslab
 12 
 13   injects slab allocation failures. (kmalloc(), kmem_cache_alloc(), ...)
 14 
 15 - fail_page_alloc
 16 
 17   injects page allocation failures. (alloc_pages(), get_free_pages(), ...)
 18 
 19 - fail_usercopy
 20 
 21   injects failures in user memory access functions. (copy_from_user(), get_user(), ...)
 22 
 23 - fail_futex
 24 
 25   injects futex deadlock and uaddr fault errors.
 26 
 27 - fail_sunrpc
 28 
 29   injects kernel RPC client and server failures.
 30 
 31 - fail_make_request
 32 
 33   injects disk IO errors on devices permitted by setting
 34   /sys/block/<device>/make-it-fail or
 35   /sys/block/<device>/<partition>/make-it-fail. (submit_bio_noacct())
 36 
 37 - fail_mmc_request
 38 
 39   injects MMC data errors on devices permitted by setting
 40   debugfs entries under /sys/kernel/debug/mmc0/fail_mmc_request
 41 
 42 - fail_function
 43 
 44   injects error return on specific functions, which are marked by
 45   ALLOW_ERROR_INJECTION() macro, by setting debugfs entries
 46   under /sys/kernel/debug/fail_function. No boot option supported.
 47 
 48 - NVMe fault injection
 49 
 50   inject NVMe status code and retry flag on devices permitted by setting
 51   debugfs entries under /sys/kernel/debug/nvme*/fault_inject. The default
 52   status code is NVME_SC_INVALID_OPCODE with no retry. The status code and
 53   retry flag can be set via the debugfs.
 54 
 55 - Null test block driver fault injection
 56 
 57   inject IO timeouts by setting config items under
 58   /sys/kernel/config/nullb/<disk>/timeout_inject,
 59   inject requeue requests by setting config items under
 60   /sys/kernel/config/nullb/<disk>/requeue_inject, and
 61   inject init_hctx() errors by setting config items under
 62   /sys/kernel/config/nullb/<disk>/init_hctx_fault_inject.
 63 
 64 Configure fault-injection capabilities behavior
 65 -----------------------------------------------
 66 
 67 debugfs entries
 68 ^^^^^^^^^^^^^^^
 69 
 70 fault-inject-debugfs kernel module provides some debugfs entries for runtime
 71 configuration of fault-injection capabilities.
 72 
 73 - /sys/kernel/debug/fail*/probability:
 74 
 75         likelihood of failure injection, in percent.
 76 
 77         Format: <percent>
 78 
 79         Note that one-failure-per-hundred is a very high error rate
 80         for some testcases.  Consider setting probability=100 and configure
 81         /sys/kernel/debug/fail*/interval for such testcases.
 82 
 83 - /sys/kernel/debug/fail*/interval:
 84 
 85         specifies the interval between failures, for calls to
 86         should_fail() that pass all the other tests.
 87 
 88         Note that if you enable this, by setting interval>1, you will
 89         probably want to set probability=100.
 90 
 91 - /sys/kernel/debug/fail*/times:
 92 
 93         specifies how many times failures may happen at most. A value of -1
 94         means "no limit".
 95 
 96 - /sys/kernel/debug/fail*/space:
 97 
 98         specifies an initial resource "budget", decremented by "size"
 99         on each call to should_fail(,size).  Failure injection is
100         suppressed until "space" reaches zero.
101 
102 - /sys/kernel/debug/fail*/verbose
103 
104         Format: { 0 | 1 | 2 }
105 
106         specifies the verbosity of the messages when failure is
107         injected.  '0' means no messages; '1' will print only a single
108         log line per failure; '2' will print a call trace too -- useful
109         to debug the problems revealed by fault injection.
110 
111 - /sys/kernel/debug/fail*/task-filter:
112 
113         Format: { 'Y' | 'N' }
114 
115         A value of 'N' disables filtering by process (default).
116         Any positive value limits failures to only processes indicated by
117         /proc/<pid>/make-it-fail==1.
118 
119 - /sys/kernel/debug/fail*/require-start,
120   /sys/kernel/debug/fail*/require-end,
121   /sys/kernel/debug/fail*/reject-start,
122   /sys/kernel/debug/fail*/reject-end:
123 
124         specifies the range of virtual addresses tested during
125         stacktrace walking.  Failure is injected only if some caller
126         in the walked stacktrace lies within the required range, and
127         none lies within the rejected range.
128         Default required range is [0,ULONG_MAX) (whole of virtual address space).
129         Default rejected range is [0,0).
130 
131 - /sys/kernel/debug/fail*/stacktrace-depth:
132 
133         specifies the maximum stacktrace depth walked during search
134         for a caller within [require-start,require-end) OR
135         [reject-start,reject-end).
136 
137 - /sys/kernel/debug/fail_page_alloc/ignore-gfp-highmem:
138 
139         Format: { 'Y' | 'N' }
140 
141         default is 'Y', setting it to 'N' will also inject failures into
142         highmem/user allocations (__GFP_HIGHMEM allocations).
143 
144 - /sys/kernel/debug/failslab/ignore-gfp-wait:
145 - /sys/kernel/debug/fail_page_alloc/ignore-gfp-wait:
146 
147         Format: { 'Y' | 'N' }
148 
149         default is 'Y', setting it to 'N' will also inject failures
150         into allocations that can sleep (__GFP_DIRECT_RECLAIM allocations).
151 
152 - /sys/kernel/debug/fail_page_alloc/min-order:
153 
154         specifies the minimum page allocation order to be injected
155         failures.
156 
157 - /sys/kernel/debug/fail_futex/ignore-private:
158 
159         Format: { 'Y' | 'N' }
160 
161         default is 'N', setting it to 'Y' will disable failure injections
162         when dealing with private (address space) futexes.
163 
164 - /sys/kernel/debug/fail_sunrpc/ignore-client-disconnect:
165 
166         Format: { 'Y' | 'N' }
167 
168         default is 'N', setting it to 'Y' will disable disconnect
169         injection on the RPC client.
170 
171 - /sys/kernel/debug/fail_sunrpc/ignore-server-disconnect:
172 
173         Format: { 'Y' | 'N' }
174 
175         default is 'N', setting it to 'Y' will disable disconnect
176         injection on the RPC server.
177 
178 - /sys/kernel/debug/fail_sunrpc/ignore-cache-wait:
179 
180         Format: { 'Y' | 'N' }
181 
182         default is 'N', setting it to 'Y' will disable cache wait
183         injection on the RPC server.
184 
185 - /sys/kernel/debug/fail_function/inject:
186 
187         Format: { 'function-name' | '!function-name' | '' }
188 
189         specifies the target function of error injection by name.
190         If the function name leads '!' prefix, given function is
191         removed from injection list. If nothing specified ('')
192         injection list is cleared.
193 
194 - /sys/kernel/debug/fail_function/injectable:
195 
196         (read only) shows error injectable functions and what type of
197         error values can be specified. The error type will be one of
198         below;
199         - NULL: retval must be 0.
200         - ERRNO: retval must be -1 to -MAX_ERRNO (-4096).
201         - ERR_NULL: retval must be 0 or -1 to -MAX_ERRNO (-4096).
202 
203 - /sys/kernel/debug/fail_function/<function-name>/retval:
204 
205         specifies the "error" return value to inject to the given function.
206         This will be created when the user specifies a new injection entry.
207         Note that this file only accepts unsigned values. So, if you want to
208         use a negative errno, you better use 'printf' instead of 'echo', e.g.:
209         $ printf %#x -12 > retval
210 
211 Boot option
212 ^^^^^^^^^^^
213 
214 In order to inject faults while debugfs is not available (early boot time),
215 use the boot option::
216 
217         failslab=
218         fail_page_alloc=
219         fail_usercopy=
220         fail_make_request=
221         fail_futex=
222         mmc_core.fail_request=<interval>,<probability>,<space>,<times>
223 
224 proc entries
225 ^^^^^^^^^^^^
226 
227 - /proc/<pid>/fail-nth,
228   /proc/self/task/<tid>/fail-nth:
229 
230         Write to this file of integer N makes N-th call in the task fail.
231         Read from this file returns a integer value. A value of '0' indicates
232         that the fault setup with a previous write to this file was injected.
233         A positive integer N indicates that the fault wasn't yet injected.
234         Note that this file enables all types of faults (slab, futex, etc).
235         This setting takes precedence over all other generic debugfs settings
236         like probability, interval, times, etc. But per-capability settings
237         (e.g. fail_futex/ignore-private) take precedence over it.
238 
239         This feature is intended for systematic testing of faults in a single
240         system call. See an example below.
241 
242 
243 Error Injectable Functions
244 --------------------------
245 
246 This part is for the kernel developers considering to add a function to
247 ALLOW_ERROR_INJECTION() macro.
248 
249 Requirements for the Error Injectable Functions
250 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
251 
252 Since the function-level error injection forcibly changes the code path
253 and returns an error even if the input and conditions are proper, this can
254 cause unexpected kernel crash if you allow error injection on the function
255 which is NOT error injectable. Thus, you (and reviewers) must ensure;
256 
257 - The function returns an error code if it fails, and the callers must check
258   it correctly (need to recover from it).
259 
260 - The function does not execute any code which can change any state before
261   the first error return. The state includes global or local, or input
262   variable. For example, clear output address storage (e.g. `*ret = NULL`),
263   increments/decrements counter, set a flag, preempt/irq disable or get
264   a lock (if those are recovered before returning error, that will be OK.)
265 
266 The first requirement is important, and it will result in that the release
267 (free objects) functions are usually harder to inject errors than allocate
268 functions. If errors of such release functions are not correctly handled
269 it will cause a memory leak easily (the caller will confuse that the object
270 has been released or corrupted.)
271 
272 The second one is for the caller which expects the function should always
273 does something. Thus if the function error injection skips whole of the
274 function, the expectation is betrayed and causes an unexpected error.
275 
276 Type of the Error Injectable Functions
277 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
278 
279 Each error injectable functions will have the error type specified by the
280 ALLOW_ERROR_INJECTION() macro. You have to choose it carefully if you add
281 a new error injectable function. If the wrong error type is chosen, the
282 kernel may crash because it may not be able to handle the error.
283 There are 4 types of errors defined in include/asm-generic/error-injection.h
284 
285 EI_ETYPE_NULL
286   This function will return `NULL` if it fails. e.g. return an allocateed
287   object address.
288 
289 EI_ETYPE_ERRNO
290   This function will return an `-errno` error code if it fails. e.g. return
291   -EINVAL if the input is wrong. This will include the functions which will
292   return an address which encodes `-errno` by ERR_PTR() macro.
293 
294 EI_ETYPE_ERRNO_NULL
295   This function will return an `-errno` or `NULL` if it fails. If the caller
296   of this function checks the return value with IS_ERR_OR_NULL() macro, this
297   type will be appropriate.
298 
299 EI_ETYPE_TRUE
300   This function will return `true` (non-zero positive value) if it fails.
301 
302 If you specifies a wrong type, for example, EI_TYPE_ERRNO for the function
303 which returns an allocated object, it may cause a problem because the returned
304 value is not an object address and the caller can not access to the address.
305 
306 
307 How to add new fault injection capability
308 -----------------------------------------
309 
310 - #include <linux/fault-inject.h>
311 
312 - define the fault attributes
313 
314   DECLARE_FAULT_ATTR(name);
315 
316   Please see the definition of struct fault_attr in fault-inject.h
317   for details.
318 
319 - provide a way to configure fault attributes
320 
321 - boot option
322 
323   If you need to enable the fault injection capability from boot time, you can
324   provide boot option to configure it. There is a helper function for it:
325 
326         setup_fault_attr(attr, str);
327 
328 - debugfs entries
329 
330   failslab, fail_page_alloc, fail_usercopy, and fail_make_request use this way.
331   Helper functions:
332 
333         fault_create_debugfs_attr(name, parent, attr);
334 
335 - module parameters
336 
337   If the scope of the fault injection capability is limited to a
338   single kernel module, it is better to provide module parameters to
339   configure the fault attributes.
340 
341 - add a hook to insert failures
342 
343   Upon should_fail() returning true, client code should inject a failure:
344 
345         should_fail(attr, size);
346 
347 Application Examples
348 --------------------
349 
350 - Inject slab allocation failures into module init/exit code::
351 
352     #!/bin/bash
353 
354     FAILTYPE=failslab
355     echo Y > /sys/kernel/debug/$FAILTYPE/task-filter
356     echo 10 > /sys/kernel/debug/$FAILTYPE/probability
357     echo 100 > /sys/kernel/debug/$FAILTYPE/interval
358     echo -1 > /sys/kernel/debug/$FAILTYPE/times
359     echo 0 > /sys/kernel/debug/$FAILTYPE/space
360     echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
361     echo Y > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
362 
363     faulty_system()
364     {
365         bash -c "echo 1 > /proc/self/make-it-fail && exec $*"
366     }
367 
368     if [ $# -eq 0 ]
369     then
370         echo "Usage: $0 modulename [ modulename ... ]"
371         exit 1
372     fi
373 
374     for m in $*
375     do
376         echo inserting $m...
377         faulty_system modprobe $m
378 
379         echo removing $m...
380         faulty_system modprobe -r $m
381     done
382 
383 ------------------------------------------------------------------------------
384 
385 - Inject page allocation failures only for a specific module::
386 
387     #!/bin/bash
388 
389     FAILTYPE=fail_page_alloc
390     module=$1
391 
392     if [ -z $module ]
393     then
394         echo "Usage: $0 <modulename>"
395         exit 1
396     fi
397 
398     modprobe $module
399 
400     if [ ! -d /sys/module/$module/sections ]
401     then
402         echo Module $module is not loaded
403         exit 1
404     fi
405 
406     cat /sys/module/$module/sections/.text > /sys/kernel/debug/$FAILTYPE/require-start
407     cat /sys/module/$module/sections/.data > /sys/kernel/debug/$FAILTYPE/require-end
408 
409     echo N > /sys/kernel/debug/$FAILTYPE/task-filter
410     echo 10 > /sys/kernel/debug/$FAILTYPE/probability
411     echo 100 > /sys/kernel/debug/$FAILTYPE/interval
412     echo -1 > /sys/kernel/debug/$FAILTYPE/times
413     echo 0 > /sys/kernel/debug/$FAILTYPE/space
414     echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
415     echo Y > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
416     echo Y > /sys/kernel/debug/$FAILTYPE/ignore-gfp-highmem
417     echo 10 > /sys/kernel/debug/$FAILTYPE/stacktrace-depth
418 
419     trap "echo 0 > /sys/kernel/debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
420 
421     echo "Injecting errors into the module $module... (interrupt to stop)"
422     sleep 1000000
423 
424 ------------------------------------------------------------------------------
425 
426 - Inject open_ctree error while btrfs mount::
427 
428     #!/bin/bash
429 
430     rm -f testfile.img
431     dd if=/dev/zero of=testfile.img bs=1M seek=1000 count=1
432     DEVICE=$(losetup --show -f testfile.img)
433     mkfs.btrfs -f $DEVICE
434     mkdir -p tmpmnt
435 
436     FAILTYPE=fail_function
437     FAILFUNC=open_ctree
438     echo $FAILFUNC > /sys/kernel/debug/$FAILTYPE/inject
439     printf %#x -12 > /sys/kernel/debug/$FAILTYPE/$FAILFUNC/retval
440     echo N > /sys/kernel/debug/$FAILTYPE/task-filter
441     echo 100 > /sys/kernel/debug/$FAILTYPE/probability
442     echo 0 > /sys/kernel/debug/$FAILTYPE/interval
443     echo -1 > /sys/kernel/debug/$FAILTYPE/times
444     echo 0 > /sys/kernel/debug/$FAILTYPE/space
445     echo 1 > /sys/kernel/debug/$FAILTYPE/verbose
446 
447     mount -t btrfs $DEVICE tmpmnt
448     if [ $? -ne 0 ]
449     then
450         echo "SUCCESS!"
451     else
452         echo "FAILED!"
453         umount tmpmnt
454     fi
455 
456     echo > /sys/kernel/debug/$FAILTYPE/inject
457 
458     rmdir tmpmnt
459     losetup -d $DEVICE
460     rm testfile.img
461 
462 
463 Tool to run command with failslab or fail_page_alloc
464 ----------------------------------------------------
465 In order to make it easier to accomplish the tasks mentioned above, we can use
466 tools/testing/fault-injection/failcmd.sh.  Please run a command
467 "./tools/testing/fault-injection/failcmd.sh --help" for more information and
468 see the following examples.
469 
470 Examples:
471 
472 Run a command "make -C tools/testing/selftests/ run_tests" with injecting slab
473 allocation failure::
474 
475         # ./tools/testing/fault-injection/failcmd.sh \
476                 -- make -C tools/testing/selftests/ run_tests
477 
478 Same as above except to specify 100 times failures at most instead of one time
479 at most by default::
480 
481         # ./tools/testing/fault-injection/failcmd.sh --times=100 \
482                 -- make -C tools/testing/selftests/ run_tests
483 
484 Same as above except to inject page allocation failure instead of slab
485 allocation failure::
486 
487         # env FAILCMD_TYPE=fail_page_alloc \
488                 ./tools/testing/fault-injection/failcmd.sh --times=100 \
489                 -- make -C tools/testing/selftests/ run_tests
490 
491 Systematic faults using fail-nth
492 ---------------------------------
493 
494 The following code systematically faults 0-th, 1-st, 2-nd and so on
495 capabilities in the socketpair() system call::
496 
497   #include <sys/types.h>
498   #include <sys/stat.h>
499   #include <sys/socket.h>
500   #include <sys/syscall.h>
501   #include <fcntl.h>
502   #include <unistd.h>
503   #include <string.h>
504   #include <stdlib.h>
505   #include <stdio.h>
506   #include <errno.h>
507 
508   int main()
509   {
510         int i, err, res, fail_nth, fds[2];
511         char buf[128];
512 
513         system("echo N > /sys/kernel/debug/failslab/ignore-gfp-wait");
514         sprintf(buf, "/proc/self/task/%ld/fail-nth", syscall(SYS_gettid));
515         fail_nth = open(buf, O_RDWR);
516         for (i = 1;; i++) {
517                 sprintf(buf, "%d", i);
518                 write(fail_nth, buf, strlen(buf));
519                 res = socketpair(AF_LOCAL, SOCK_STREAM, 0, fds);
520                 err = errno;
521                 pread(fail_nth, buf, sizeof(buf), 0);
522                 if (res == 0) {
523                         close(fds[0]);
524                         close(fds[1]);
525                 }
526                 printf("%d-th fault %c: res=%d/%d\n", i, atoi(buf) ? 'N' : 'Y',
527                         res, err);
528                 if (atoi(buf))
529                         break;
530         }
531         return 0;
532   }
533 
534 An example output::
535 
536         1-th fault Y: res=-1/23
537         2-th fault Y: res=-1/23
538         3-th fault Y: res=-1/12
539         4-th fault Y: res=-1/12
540         5-th fault Y: res=-1/23
541         6-th fault Y: res=-1/23
542         7-th fault Y: res=-1/23
543         8-th fault Y: res=-1/12
544         9-th fault Y: res=-1/12
545         10-th fault Y: res=-1/12
546         11-th fault Y: res=-1/12
547         12-th fault Y: res=-1/12
548         13-th fault Y: res=-1/12
549         14-th fault Y: res=-1/12
550         15-th fault Y: res=-1/12
551         16-th fault N: res=0/12

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php