具体说明参考Documentation/fault-injection/fault-injection.txt文档
我在调试mmc驱动的时候用到了fail_mmc_request,可以控制产生data.error 内核配置是CONFIG_FAIL_MMC_REQUEST
Kernel hacking ---> [*] Fault-injection framework [*] Fault-injection capability for MMC IO [*] Debugfs entries for fault-injection capabilities这样在/sys/kernel/debug/mmc0目录下面就会出现fail_mmc_request目录,进入这个目录
/sys/kernel/debug/mmc0/fail_mmc_request # ls interval probability space task-filter times verbose参数说明: probability: 发生错误的概率,如果值为100,表示100%会发生 times: 限制发生错误的次数,每发生一次错误后他的值会减一。如果值为-1,表示不限错误次数。
/sys/kernel/debug/mmc0/fail_mmc_request # echo 1 > times /sys/kernel/debug/mmc0/fail_mmc_request # echo 100 > probability /sys/kernel/debug/mmc0/fail_mmc_request # veridisk -f /dev/mmcblk0 -e 1 -m 1 -v -d offset [0, 1), len [1, 2), seq pFAULT_INJECTION: forcing a failure attern 0x00 offset 0, len 1, seCPU: 0 PID: 247 Comm: mmcqd/0 Not tainted 3.10.27+ #114 q pattern 0x01 Stack : 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 83ee3cb0 ... Call Trace:[<800152a4>] 0x800152a4 [<800152a4>] 0x800152a4 [<801d036c>] 0x801d036c [<8034766c>] 0x8034766c [<80040000>] 0x80040000 [<80348458>] 0x80348458 [<803558bc>] 0x803558bc [<801b03cc>] 0x801b03cc [<80356ebc>] 0x80356ebc [<80347b60>] 0x80347b60 [<80045f0c>] 0x80045f0c [<803575b4>] 0x803575b4 [<80048898>] 0x80048898 [<80357fe8>] 0x80357fe8 [<80357f00>] 0x80357f00 [<80357f00>] 0x80357f00 [<8003cd10>] 0x8003cd10 [<80045b4c>] 0x80045b4c [<80045c10>] 0x80045c10 [<8003cc58>] 0x8003cc58 [<800129fc>] 0x800129fc mmcblk0: error -145 transferring data, sector 0, nr 1, cmd response 0x900, card status 0x0 w 0.002MB/s, r 1.055MB/s pass 1/1, w 0.002MB/s, r 1.055MB/s veridisk_write_loop: -------------------- TEST RESULT -------------------- veridisk_write_loop: pass 1/1, w 0.002MB/s, r 1.055MB/s veridisk_write_loop: failed count: open 0, write 0, read 0, compare 0 //再次执行由于times已经变为0,所以不会在出现传输出错的情况。 /sys/kernel/debug/mmc0/fail_mmc_request # veridisk -f /dev/mmcblk0 -e 1 -m 1 -v -d offset [0, 1), len [1, 2), seq pattern 0x00 offset 0, len 1, seq pattern 0x01 w 0.030MB/s, r 0.656MB/s pass 1/1, w 0.030MB/s, r 0.656MB/s veridisk_write_loop: -------------------- TEST RESULT -------------------- veridisk_write_loop: pass 1/1, w 0.030MB/s, r 0.656MB/s veridisk_write_loop: failed count: open 0, write 0, read 0, compare 0 /sys/kernel/debug/mmc0/fail_mmc_request # #ifdef CONFIG_FAIL_MMC_REQUEST static void mmc_should_fail_request(struct mmc_host *host, struct mmc_request *mrq) { struct mmc_command *cmd = mrq->cmd; struct mmc_data *data = mrq->data; static const int data_errors[] = { -ETIMEDOUT, -EILSEQ, -EIO, }; if (!data) return; if (cmd->error || data->error || !should_fail(&host->fail_mmc_request, data->blksz * data->blocks)) return; data->error = data_errors[prandom_u32() % ARRAY_SIZE(data_errors)]; data->bytes_xfered = (prandom_u32() % (data->bytes_xfered >> 9)) << 9; } #else static inline void mmc_should_fail_request(struct mmc_host *host, struct mmc_request *mrq) { } #endif当在mmc_request_done函数中调用mmc_should_fail_request,会按照一定的规则赋值data->error,可能出现的错有ETIMEDOUT,EILSEQ,EIO,这样就可以模拟data传输概率出错的情况了。并且在mmc/core/debugfs.c文件中会在/sys/kernel/debug/mmc0目录下创建fail_mmc_request目录。
