18c2ecf20Sopenharmony_ci=========================================== 28c2ecf20Sopenharmony_ciFault injection capabilities infrastructure 38c2ecf20Sopenharmony_ci=========================================== 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ciSee also drivers/md/md-faulty.c and "every_nth" module option for scsi_debug. 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ciAvailable fault injection capabilities 98c2ecf20Sopenharmony_ci-------------------------------------- 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci- failslab 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci injects slab allocation failures. (kmalloc(), kmem_cache_alloc(), ...) 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci- fail_page_alloc 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci injects page allocation failures. (alloc_pages(), get_free_pages(), ...) 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci- fail_usercopy 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci injects failures in user memory access functions. (copy_from_user(), get_user(), ...) 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci- fail_futex 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci injects futex deadlock and uaddr fault errors. 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci- fail_make_request 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci injects disk IO errors on devices permitted by setting 308c2ecf20Sopenharmony_ci /sys/block/<device>/make-it-fail or 318c2ecf20Sopenharmony_ci /sys/block/<device>/<partition>/make-it-fail. (submit_bio_noacct()) 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci- fail_mmc_request 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci injects MMC data errors on devices permitted by setting 368c2ecf20Sopenharmony_ci debugfs entries under /sys/kernel/debug/mmc0/fail_mmc_request 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci- fail_function 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci injects error return on specific functions, which are marked by 418c2ecf20Sopenharmony_ci ALLOW_ERROR_INJECTION() macro, by setting debugfs entries 428c2ecf20Sopenharmony_ci under /sys/kernel/debug/fail_function. No boot option supported. 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci- NVMe fault injection 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci inject NVMe status code and retry flag on devices permitted by setting 478c2ecf20Sopenharmony_ci debugfs entries under /sys/kernel/debug/nvme*/fault_inject. The default 488c2ecf20Sopenharmony_ci status code is NVME_SC_INVALID_OPCODE with no retry. The status code and 498c2ecf20Sopenharmony_ci retry flag can be set via the debugfs. 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ciConfigure fault-injection capabilities behavior 538c2ecf20Sopenharmony_ci----------------------------------------------- 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cidebugfs entries 568c2ecf20Sopenharmony_ci^^^^^^^^^^^^^^^ 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cifault-inject-debugfs kernel module provides some debugfs entries for runtime 598c2ecf20Sopenharmony_ciconfiguration of fault-injection capabilities. 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/probability: 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci likelihood of failure injection, in percent. 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci Format: <percent> 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci Note that one-failure-per-hundred is a very high error rate 688c2ecf20Sopenharmony_ci for some testcases. Consider setting probability=100 and configure 698c2ecf20Sopenharmony_ci /sys/kernel/debug/fail*/interval for such testcases. 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/interval: 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci specifies the interval between failures, for calls to 748c2ecf20Sopenharmony_ci should_fail() that pass all the other tests. 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci Note that if you enable this, by setting interval>1, you will 778c2ecf20Sopenharmony_ci probably want to set probability=100. 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/times: 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci specifies how many times failures may happen at most. A value of -1 828c2ecf20Sopenharmony_ci means "no limit". 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/space: 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci specifies an initial resource "budget", decremented by "size" 878c2ecf20Sopenharmony_ci on each call to should_fail(,size). Failure injection is 888c2ecf20Sopenharmony_ci suppressed until "space" reaches zero. 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/verbose 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci Format: { 0 | 1 | 2 } 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci specifies the verbosity of the messages when failure is 958c2ecf20Sopenharmony_ci injected. '0' means no messages; '1' will print only a single 968c2ecf20Sopenharmony_ci log line per failure; '2' will print a call trace too -- useful 978c2ecf20Sopenharmony_ci to debug the problems revealed by fault injection. 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/task-filter: 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci Format: { 'Y' | 'N' } 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci A value of 'N' disables filtering by process (default). 1048c2ecf20Sopenharmony_ci Any positive value limits failures to only processes indicated by 1058c2ecf20Sopenharmony_ci /proc/<pid>/make-it-fail==1. 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/require-start, 1088c2ecf20Sopenharmony_ci /sys/kernel/debug/fail*/require-end, 1098c2ecf20Sopenharmony_ci /sys/kernel/debug/fail*/reject-start, 1108c2ecf20Sopenharmony_ci /sys/kernel/debug/fail*/reject-end: 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci specifies the range of virtual addresses tested during 1138c2ecf20Sopenharmony_ci stacktrace walking. Failure is injected only if some caller 1148c2ecf20Sopenharmony_ci in the walked stacktrace lies within the required range, and 1158c2ecf20Sopenharmony_ci none lies within the rejected range. 1168c2ecf20Sopenharmony_ci Default required range is [0,ULONG_MAX) (whole of virtual address space). 1178c2ecf20Sopenharmony_ci Default rejected range is [0,0). 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/stacktrace-depth: 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci specifies the maximum stacktrace depth walked during search 1228c2ecf20Sopenharmony_ci for a caller within [require-start,require-end) OR 1238c2ecf20Sopenharmony_ci [reject-start,reject-end). 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_page_alloc/ignore-gfp-highmem: 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci Format: { 'Y' | 'N' } 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci default is 'N', setting it to 'Y' won't inject failures into 1308c2ecf20Sopenharmony_ci highmem/user allocations. 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci- /sys/kernel/debug/failslab/ignore-gfp-wait: 1338c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_page_alloc/ignore-gfp-wait: 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci Format: { 'Y' | 'N' } 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci default is 'N', setting it to 'Y' will inject failures 1388c2ecf20Sopenharmony_ci only into non-sleep allocations (GFP_ATOMIC allocations). 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_page_alloc/min-order: 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci specifies the minimum page allocation order to be injected 1438c2ecf20Sopenharmony_ci failures. 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_futex/ignore-private: 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci Format: { 'Y' | 'N' } 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci default is 'N', setting it to 'Y' will disable failure injections 1508c2ecf20Sopenharmony_ci when dealing with private (address space) futexes. 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_function/inject: 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci Format: { 'function-name' | '!function-name' | '' } 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci specifies the target function of error injection by name. 1578c2ecf20Sopenharmony_ci If the function name leads '!' prefix, given function is 1588c2ecf20Sopenharmony_ci removed from injection list. If nothing specified ('') 1598c2ecf20Sopenharmony_ci injection list is cleared. 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_function/injectable: 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci (read only) shows error injectable functions and what type of 1648c2ecf20Sopenharmony_ci error values can be specified. The error type will be one of 1658c2ecf20Sopenharmony_ci below; 1668c2ecf20Sopenharmony_ci - NULL: retval must be 0. 1678c2ecf20Sopenharmony_ci - ERRNO: retval must be -1 to -MAX_ERRNO (-4096). 1688c2ecf20Sopenharmony_ci - ERR_NULL: retval must be 0 or -1 to -MAX_ERRNO (-4096). 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_function/<function-name>/retval: 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci specifies the "error" return value to inject to the given function. 1738c2ecf20Sopenharmony_ci This will be created when the user specifies a new injection entry. 1748c2ecf20Sopenharmony_ci Note that this file only accepts unsigned values. So, if you want to 1758c2ecf20Sopenharmony_ci use a negative errno, you better use 'printf' instead of 'echo', e.g.: 1768c2ecf20Sopenharmony_ci $ printf %#x -12 > retval 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ciBoot option 1798c2ecf20Sopenharmony_ci^^^^^^^^^^^ 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ciIn order to inject faults while debugfs is not available (early boot time), 1828c2ecf20Sopenharmony_ciuse the boot option:: 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci failslab= 1858c2ecf20Sopenharmony_ci fail_page_alloc= 1868c2ecf20Sopenharmony_ci fail_usercopy= 1878c2ecf20Sopenharmony_ci fail_make_request= 1888c2ecf20Sopenharmony_ci fail_futex= 1898c2ecf20Sopenharmony_ci mmc_core.fail_request=<interval>,<probability>,<space>,<times> 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ciproc entries 1928c2ecf20Sopenharmony_ci^^^^^^^^^^^^ 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci- /proc/<pid>/fail-nth, 1958c2ecf20Sopenharmony_ci /proc/self/task/<tid>/fail-nth: 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci Write to this file of integer N makes N-th call in the task fail. 1988c2ecf20Sopenharmony_ci Read from this file returns a integer value. A value of '0' indicates 1998c2ecf20Sopenharmony_ci that the fault setup with a previous write to this file was injected. 2008c2ecf20Sopenharmony_ci A positive integer N indicates that the fault wasn't yet injected. 2018c2ecf20Sopenharmony_ci Note that this file enables all types of faults (slab, futex, etc). 2028c2ecf20Sopenharmony_ci This setting takes precedence over all other generic debugfs settings 2038c2ecf20Sopenharmony_ci like probability, interval, times, etc. But per-capability settings 2048c2ecf20Sopenharmony_ci (e.g. fail_futex/ignore-private) take precedence over it. 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci This feature is intended for systematic testing of faults in a single 2078c2ecf20Sopenharmony_ci system call. See an example below. 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ciHow to add new fault injection capability 2108c2ecf20Sopenharmony_ci----------------------------------------- 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci- #include <linux/fault-inject.h> 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci- define the fault attributes 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci DECLARE_FAULT_ATTR(name); 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci Please see the definition of struct fault_attr in fault-inject.h 2198c2ecf20Sopenharmony_ci for details. 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci- provide a way to configure fault attributes 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ci- boot option 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_ci If you need to enable the fault injection capability from boot time, you can 2268c2ecf20Sopenharmony_ci provide boot option to configure it. There is a helper function for it: 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ci setup_fault_attr(attr, str); 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ci- debugfs entries 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci failslab, fail_page_alloc, fail_usercopy, and fail_make_request use this way. 2338c2ecf20Sopenharmony_ci Helper functions: 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci fault_create_debugfs_attr(name, parent, attr); 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci- module parameters 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_ci If the scope of the fault injection capability is limited to a 2408c2ecf20Sopenharmony_ci single kernel module, it is better to provide module parameters to 2418c2ecf20Sopenharmony_ci configure the fault attributes. 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci- add a hook to insert failures 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci Upon should_fail() returning true, client code should inject a failure: 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci should_fail(attr, size); 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ciApplication Examples 2508c2ecf20Sopenharmony_ci-------------------- 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci- Inject slab allocation failures into module init/exit code:: 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci #!/bin/bash 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci FAILTYPE=failslab 2578c2ecf20Sopenharmony_ci echo Y > /sys/kernel/debug/$FAILTYPE/task-filter 2588c2ecf20Sopenharmony_ci echo 10 > /sys/kernel/debug/$FAILTYPE/probability 2598c2ecf20Sopenharmony_ci echo 100 > /sys/kernel/debug/$FAILTYPE/interval 2608c2ecf20Sopenharmony_ci echo -1 > /sys/kernel/debug/$FAILTYPE/times 2618c2ecf20Sopenharmony_ci echo 0 > /sys/kernel/debug/$FAILTYPE/space 2628c2ecf20Sopenharmony_ci echo 2 > /sys/kernel/debug/$FAILTYPE/verbose 2638c2ecf20Sopenharmony_ci echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_ci faulty_system() 2668c2ecf20Sopenharmony_ci { 2678c2ecf20Sopenharmony_ci bash -c "echo 1 > /proc/self/make-it-fail && exec $*" 2688c2ecf20Sopenharmony_ci } 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci if [ $# -eq 0 ] 2718c2ecf20Sopenharmony_ci then 2728c2ecf20Sopenharmony_ci echo "Usage: $0 modulename [ modulename ... ]" 2738c2ecf20Sopenharmony_ci exit 1 2748c2ecf20Sopenharmony_ci fi 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci for m in $* 2778c2ecf20Sopenharmony_ci do 2788c2ecf20Sopenharmony_ci echo inserting $m... 2798c2ecf20Sopenharmony_ci faulty_system modprobe $m 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci echo removing $m... 2828c2ecf20Sopenharmony_ci faulty_system modprobe -r $m 2838c2ecf20Sopenharmony_ci done 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci------------------------------------------------------------------------------ 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci- Inject page allocation failures only for a specific module:: 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci #!/bin/bash 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci FAILTYPE=fail_page_alloc 2928c2ecf20Sopenharmony_ci module=$1 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci if [ -z $module ] 2958c2ecf20Sopenharmony_ci then 2968c2ecf20Sopenharmony_ci echo "Usage: $0 <modulename>" 2978c2ecf20Sopenharmony_ci exit 1 2988c2ecf20Sopenharmony_ci fi 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci modprobe $module 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci if [ ! -d /sys/module/$module/sections ] 3038c2ecf20Sopenharmony_ci then 3048c2ecf20Sopenharmony_ci echo Module $module is not loaded 3058c2ecf20Sopenharmony_ci exit 1 3068c2ecf20Sopenharmony_ci fi 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci cat /sys/module/$module/sections/.text > /sys/kernel/debug/$FAILTYPE/require-start 3098c2ecf20Sopenharmony_ci cat /sys/module/$module/sections/.data > /sys/kernel/debug/$FAILTYPE/require-end 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_ci echo N > /sys/kernel/debug/$FAILTYPE/task-filter 3128c2ecf20Sopenharmony_ci echo 10 > /sys/kernel/debug/$FAILTYPE/probability 3138c2ecf20Sopenharmony_ci echo 100 > /sys/kernel/debug/$FAILTYPE/interval 3148c2ecf20Sopenharmony_ci echo -1 > /sys/kernel/debug/$FAILTYPE/times 3158c2ecf20Sopenharmony_ci echo 0 > /sys/kernel/debug/$FAILTYPE/space 3168c2ecf20Sopenharmony_ci echo 2 > /sys/kernel/debug/$FAILTYPE/verbose 3178c2ecf20Sopenharmony_ci echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait 3188c2ecf20Sopenharmony_ci echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-highmem 3198c2ecf20Sopenharmony_ci echo 10 > /sys/kernel/debug/$FAILTYPE/stacktrace-depth 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_ci trap "echo 0 > /sys/kernel/debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci echo "Injecting errors into the module $module... (interrupt to stop)" 3248c2ecf20Sopenharmony_ci sleep 1000000 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci------------------------------------------------------------------------------ 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_ci- Inject open_ctree error while btrfs mount:: 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ci #!/bin/bash 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci rm -f testfile.img 3338c2ecf20Sopenharmony_ci dd if=/dev/zero of=testfile.img bs=1M seek=1000 count=1 3348c2ecf20Sopenharmony_ci DEVICE=$(losetup --show -f testfile.img) 3358c2ecf20Sopenharmony_ci mkfs.btrfs -f $DEVICE 3368c2ecf20Sopenharmony_ci mkdir -p tmpmnt 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci FAILTYPE=fail_function 3398c2ecf20Sopenharmony_ci FAILFUNC=open_ctree 3408c2ecf20Sopenharmony_ci echo $FAILFUNC > /sys/kernel/debug/$FAILTYPE/inject 3418c2ecf20Sopenharmony_ci printf %#x -12 > /sys/kernel/debug/$FAILTYPE/$FAILFUNC/retval 3428c2ecf20Sopenharmony_ci echo N > /sys/kernel/debug/$FAILTYPE/task-filter 3438c2ecf20Sopenharmony_ci echo 100 > /sys/kernel/debug/$FAILTYPE/probability 3448c2ecf20Sopenharmony_ci echo 0 > /sys/kernel/debug/$FAILTYPE/interval 3458c2ecf20Sopenharmony_ci echo -1 > /sys/kernel/debug/$FAILTYPE/times 3468c2ecf20Sopenharmony_ci echo 0 > /sys/kernel/debug/$FAILTYPE/space 3478c2ecf20Sopenharmony_ci echo 1 > /sys/kernel/debug/$FAILTYPE/verbose 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_ci mount -t btrfs $DEVICE tmpmnt 3508c2ecf20Sopenharmony_ci if [ $? -ne 0 ] 3518c2ecf20Sopenharmony_ci then 3528c2ecf20Sopenharmony_ci echo "SUCCESS!" 3538c2ecf20Sopenharmony_ci else 3548c2ecf20Sopenharmony_ci echo "FAILED!" 3558c2ecf20Sopenharmony_ci umount tmpmnt 3568c2ecf20Sopenharmony_ci fi 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_ci echo > /sys/kernel/debug/$FAILTYPE/inject 3598c2ecf20Sopenharmony_ci 3608c2ecf20Sopenharmony_ci rmdir tmpmnt 3618c2ecf20Sopenharmony_ci losetup -d $DEVICE 3628c2ecf20Sopenharmony_ci rm testfile.img 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ciTool to run command with failslab or fail_page_alloc 3668c2ecf20Sopenharmony_ci---------------------------------------------------- 3678c2ecf20Sopenharmony_ciIn order to make it easier to accomplish the tasks mentioned above, we can use 3688c2ecf20Sopenharmony_citools/testing/fault-injection/failcmd.sh. Please run a command 3698c2ecf20Sopenharmony_ci"./tools/testing/fault-injection/failcmd.sh --help" for more information and 3708c2ecf20Sopenharmony_cisee the following examples. 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ciExamples: 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ciRun a command "make -C tools/testing/selftests/ run_tests" with injecting slab 3758c2ecf20Sopenharmony_ciallocation failure:: 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci # ./tools/testing/fault-injection/failcmd.sh \ 3788c2ecf20Sopenharmony_ci -- make -C tools/testing/selftests/ run_tests 3798c2ecf20Sopenharmony_ci 3808c2ecf20Sopenharmony_ciSame as above except to specify 100 times failures at most instead of one time 3818c2ecf20Sopenharmony_ciat most by default:: 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ci # ./tools/testing/fault-injection/failcmd.sh --times=100 \ 3848c2ecf20Sopenharmony_ci -- make -C tools/testing/selftests/ run_tests 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_ciSame as above except to inject page allocation failure instead of slab 3878c2ecf20Sopenharmony_ciallocation failure:: 3888c2ecf20Sopenharmony_ci 3898c2ecf20Sopenharmony_ci # env FAILCMD_TYPE=fail_page_alloc \ 3908c2ecf20Sopenharmony_ci ./tools/testing/fault-injection/failcmd.sh --times=100 \ 3918c2ecf20Sopenharmony_ci -- make -C tools/testing/selftests/ run_tests 3928c2ecf20Sopenharmony_ci 3938c2ecf20Sopenharmony_ciSystematic faults using fail-nth 3948c2ecf20Sopenharmony_ci--------------------------------- 3958c2ecf20Sopenharmony_ci 3968c2ecf20Sopenharmony_ciThe following code systematically faults 0-th, 1-st, 2-nd and so on 3978c2ecf20Sopenharmony_cicapabilities in the socketpair() system call:: 3988c2ecf20Sopenharmony_ci 3998c2ecf20Sopenharmony_ci #include <sys/types.h> 4008c2ecf20Sopenharmony_ci #include <sys/stat.h> 4018c2ecf20Sopenharmony_ci #include <sys/socket.h> 4028c2ecf20Sopenharmony_ci #include <sys/syscall.h> 4038c2ecf20Sopenharmony_ci #include <fcntl.h> 4048c2ecf20Sopenharmony_ci #include <unistd.h> 4058c2ecf20Sopenharmony_ci #include <string.h> 4068c2ecf20Sopenharmony_ci #include <stdlib.h> 4078c2ecf20Sopenharmony_ci #include <stdio.h> 4088c2ecf20Sopenharmony_ci #include <errno.h> 4098c2ecf20Sopenharmony_ci 4108c2ecf20Sopenharmony_ci int main() 4118c2ecf20Sopenharmony_ci { 4128c2ecf20Sopenharmony_ci int i, err, res, fail_nth, fds[2]; 4138c2ecf20Sopenharmony_ci char buf[128]; 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ci system("echo N > /sys/kernel/debug/failslab/ignore-gfp-wait"); 4168c2ecf20Sopenharmony_ci sprintf(buf, "/proc/self/task/%ld/fail-nth", syscall(SYS_gettid)); 4178c2ecf20Sopenharmony_ci fail_nth = open(buf, O_RDWR); 4188c2ecf20Sopenharmony_ci for (i = 1;; i++) { 4198c2ecf20Sopenharmony_ci sprintf(buf, "%d", i); 4208c2ecf20Sopenharmony_ci write(fail_nth, buf, strlen(buf)); 4218c2ecf20Sopenharmony_ci res = socketpair(AF_LOCAL, SOCK_STREAM, 0, fds); 4228c2ecf20Sopenharmony_ci err = errno; 4238c2ecf20Sopenharmony_ci pread(fail_nth, buf, sizeof(buf), 0); 4248c2ecf20Sopenharmony_ci if (res == 0) { 4258c2ecf20Sopenharmony_ci close(fds[0]); 4268c2ecf20Sopenharmony_ci close(fds[1]); 4278c2ecf20Sopenharmony_ci } 4288c2ecf20Sopenharmony_ci printf("%d-th fault %c: res=%d/%d\n", i, atoi(buf) ? 'N' : 'Y', 4298c2ecf20Sopenharmony_ci res, err); 4308c2ecf20Sopenharmony_ci if (atoi(buf)) 4318c2ecf20Sopenharmony_ci break; 4328c2ecf20Sopenharmony_ci } 4338c2ecf20Sopenharmony_ci return 0; 4348c2ecf20Sopenharmony_ci } 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_ciAn example output:: 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_ci 1-th fault Y: res=-1/23 4398c2ecf20Sopenharmony_ci 2-th fault Y: res=-1/23 4408c2ecf20Sopenharmony_ci 3-th fault Y: res=-1/12 4418c2ecf20Sopenharmony_ci 4-th fault Y: res=-1/12 4428c2ecf20Sopenharmony_ci 5-th fault Y: res=-1/23 4438c2ecf20Sopenharmony_ci 6-th fault Y: res=-1/23 4448c2ecf20Sopenharmony_ci 7-th fault Y: res=-1/23 4458c2ecf20Sopenharmony_ci 8-th fault Y: res=-1/12 4468c2ecf20Sopenharmony_ci 9-th fault Y: res=-1/12 4478c2ecf20Sopenharmony_ci 10-th fault Y: res=-1/12 4488c2ecf20Sopenharmony_ci 11-th fault Y: res=-1/12 4498c2ecf20Sopenharmony_ci 12-th fault Y: res=-1/12 4508c2ecf20Sopenharmony_ci 13-th fault Y: res=-1/12 4518c2ecf20Sopenharmony_ci 14-th fault Y: res=-1/12 4528c2ecf20Sopenharmony_ci 15-th fault Y: res=-1/12 4538c2ecf20Sopenharmony_ci 16-th fault N: res=0/12 454