Fault injection
テストのコードカバレッジを上げるのコードカバレッジを上げるコードカバレッジを上げるを上げる上げるげる

Yoichi Yuasa
OSAKA NDS Embedded Linux Cross Forum #10

自己紹介


湯浅陽一



1999年よりよりLinux kernel開発に参加に参加参加



MIPSアーキテクチャのいくつかののコードカバレッジを上げるいくつかのコードカバレッジを上げるCPUへLinuxkernelを上げる移植

本日の内容のコードカバレッジを上げる内容
Fault InjectionとはLinux Fault-injectionのコードカバレッジを上げる紹介

Linux Fault-injectionのコードカバレッジを上げる組込みみFault Injectionとは

エラー処理など通常は発生しない状況をテストなど通常は発生しない状況をテスト通常は発生しない状況をテストは発に参加生しない状況をテストしない状況をテストを上げるテストのコードカバレッジを上げるするために参加意図的に状態を発生させるに参加状態を発生させるを上げる発に参加生しない状況をテストさせる

ハードウエアを上げる改造して状態を発生させるして状態を発生させる状態を発生させるを上げる発に参加生しない状況をテストさせる

ソフトのコードカバレッジを上げるウエアを上げる変更して状態を発生させるして状態を発生させる状態を発生させるを上げる発に参加生しない状況をテストさせる

テストのコードカバレッジを上げるカバレッジを上げるを上げる上げるげるためのコードカバレッジを上げる手段

Linux Fault-injection

Fault injectionのコードカバレッジを上げるためのコードカバレッジを上げるフレームワークと各機能向けの個別実装けのコードカバレッジを上げる個別実装
kmalloc



alloc_pages

Disk I/O



futex



MMC I/Oなど通常は発生しない状況をテスト

Fault-injection
kernel configuration menu
Kernel hacking→Kernel Testing and Coverage[*] Fault-injection framework[*] Fault-injection capability for kmalloc[*] Fault-injection capability for alloc_pages()[*] Fault-injection capability for disk IO[*] Fault-injection capability for faking disk interrupts[*] Fault-injection capability for futexes[*] Debugfs entries for fault-injection capabilities[*]

Fault-injection capability for MMC IO

Linux Fault-injectionのコードカバレッジを上げる仕組み処理など通常は発生しない状況をテストのコードカバレッジを上げる中にに参加should_fail関数を追加して、返り値を上げる追加して状態を発生させる、返り値返り値り値がtrueのコードカバレッジを上げるときは発に参加生しない状況をテストさせたい状態を発生させるに参加遷移させる
falseのコードカバレッジを上げるときは通常は発生しない状況をテストのコードカバレッジを上げる処理など通常は発生しない状況をテスト

Linux Fault-injection
debugfs上げるのコードカバレッジを上げるファイルインターフェースで制御制御

発に参加生しない状況をテスト確率、返り値間隔や回数など制御可能や回数など制御可能回数を追加して、返り値など通常は発生しない状況をテスト制御可能

debugfsから設定した値を設定した値をした値を上げるshould_fail関数を追加して、返り値内で制御判定した値をインターフェース

probabilityinterval



times



space



verboseverbose_ratelimit_interval_msverbose_ratelimit_bursttask-filterprobability
should_fail関数を追加して、返り値がtrueとなる確率パーセントのコードカバレッジを上げるで制御設定した値を(0〜100)interval
should_fail関数を追加して、返り値がtrueに参加なる間隔や回数など制御可能

2回に参加1回なら設定した値を2に参加設定した値を

正確に参加intervalで制御trueに参加するに参加はprobabilityを上げる100に参加設定した値を

times

should_fail関数を追加して、返り値がtrueに参加なる回数を追加して、返り値



-1は無限



should_fail関数を追加して、返り値がtrueに参加なると1減算されるされる

spaceshould_fail関数を追加して、返り値のコードカバレッジを上げる第2引数を追加して、返り値で制御あるsizeで制御指定した値をした数を追加して、返り値だけ減算されるされて状態を発生させるいく
spaceがsize以下になるとに参加なるとshould_fail関数を追加して、返り値がtrueを上げる返り値すように参加なる
少し経過してからし経過してからして状態を発生させるから設定した値をFault-injectionを上げる機能させたい場合に利用に参加利用verboseshould_fail関数を追加して、返り値がtureのコードカバレッジを上げるときに参加出力されるメッされるメッセージを上げるのコードカバレッジを上げる内容を上げる設定した値を–0: 無出力されるメッ– 1: FAULT INJECTION: forcing a failure.で制御始まる文字列出力、出力レベルはまる文字列出力されるメッ、返り値出力されるメッレベルは
KERN_NOTICE– 2: 1のコードカバレッジを上げる出力されるメッ+スタックダンプ

verbose_ratelimit_burst
verboseのコードカバレッジを上げるメッセージを上げるを上げる設定した値をした回数を追加して、返り値まで制御しか表示しないようにするしないように参加する
何度も同じメッセージを表示しないように設定も同じメッセージを表示しないように設定同じメッセージを表示しないように設定じメッセージを表示しないように設定メッセージを上げるを上げる表示しないようにするしないように参加設定した値をするために参加利用verbose_ratelimit_interval_msverbose_ratelimit_burstのコードカバレッジを上げる計算される期間を上げる設定した値を(jiffies)
設定した値を期間を上げる経過してからするとburstと比較する値をリする値を上げるリセットのコードカバレッジを上げる
interval_msが0のコードカバレッジを上げる場合に利用はburst設定した値をは無効

task-filtershould_fail関数を追加して、返り値が機能するかを上げるPID毎に設定に参加設定した値を–

N: 無効

–

Y: 有効

/proc/<pid>/make-it-failを上げる1に参加設定した値をして状態を発生させるいるとそのコードカバレッジを上げるPIDで制御は他の条件に従ってのコードカバレッジを上げる条件に従ってに参加従ってって状態を発生させるshould_fail関数を追加して、返り値がtrueに参加なる

Linux Fault-injectionのコードカバレッジを上げる組込みみKernel configurationを上げる有効に参加する– [*] Fault-injection framework– [*] Debugfs entries for fault-injection capabilities

struct fault_attrを上げる定した値を義するする

should_fail関数を追加して、返り値を上げる追加する

実際にに参加I2C read/writeに参加組込みんで制御みる

struct fault_attrのコードカバレッジを上げる定した値を義する


利用して状態を発生させるいるI2Cホストのコードカバレッジを上げるコントのコードカバレッジを上げるローラドライバへ以下になるとを上げる追加
include <linux/fault-inject.h>
DECLARE_FAULT_ATTR(fail_i2c_attr);



DECLARE_FAULT_ATTRマクロで制御はprobabilityが0

起動時から機能させたい場合は個別に設定から設定した値を機能させたい場合に利用は個別に参加設定した値をinterval,probability,space,timesはkernel command
lineから設定した値を設定した値をすることも同じメッセージを表示しないように設定可能

struct fault_attrのコードカバレッジを上げる定した値を義する
struct fault_attr fail_i2c_attr = {.probability = 100,.interval = 1,.times = ATOMIC_INIT(10),.space = ATOMIC_INIT(0),.verbose = 2,
.task_filter = false,.ratelimit_state = RATELIMIT_STATE_INIT_DISABLED,.dname = NULL,};should_fail関数を追加して、返り値
bool should_fail(struct fault_attr *attr, ssize_t size)
sizeはshould_fail関数を追加して、返り値呼び出し時にび出し時に出し時から機能させたい場合は個別に設定に参加spaceから設定した値を減算されるされる値

should_fail関数を追加して、返り値のコードカバレッジを上げる追加
I2C read/writeで制御通る__i2c_transfer関数を追加して、返り値に参加should_fail関数を追加して、返り値を上げる追加



__i2c_transfer関数を追加して、返り値のコードカバレッジを上げる返り値り値を上げるshould_fail関数を追加して、返り値がtrueのコードカバレッジを上げるときに参加書き換えるき換えるえる
if (shoud_fail(&fail_i2c_attr, 1) {static const int i2c_errors[] = {-ETIMEDOUT,-ENXIO,-EBUSY,};
ret = i2c_errors[prandom_u32() % ARRAY_SIZE(i2c_errors)];}
return ret;Fault-injection発に参加生しない状況をテスト/sys/kernel/debug/fail_i2c# ls -1
interval
probability
spacetask-filter
times
verboseverbose_ratelimit_burst
verbose_ratelimit_interval_ms/sys/kernel/debug/fail_i2c# ls -1 | xargs cat
11000N8 ← 10に参加設定した値をしたtimesが2回Fault-injectionが発に参加生しない状況をテストしたことに参加より減算されるされて状態を発生させるいる
2100

Fault-injection時から機能させたい場合は個別に設定メッセージを上げる
FAULT_INJECTION: forcing a failure.
name fail_i2c, interval 1, probability 100, space 0, times 9
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.162 #14
Hardware name: ????
Call trace:[<ffff00000808966c>] dump_backtrace+0x0/0x390[<ffff000008089a10>] show_stack+0x14/0x1c[<ffff000008778054>] dump_stack+0xc0/0x100[<ffff0000083aef48>] should_fail+0x80/0x184[<ffff000008544a0c>] __i2c_transfer+0x41c/0x4e4[<ffff000008544b50>] i2c_transfer+0x7c/0xb0[<ffff000008544bd8>] i2c_transfer_buffer_flags+0x54/0x7c[<ffff0000084c9eec>] regmap_i2c_write+0x1c/0x44[<ffff0000084c6178>] _regmap_raw_write+0x51c/0x714[<ffff0000084c63d8>] _regmap_bus_raw_write+0x68/0x74[<ffff0000084c5158>] _regmap_write+0xdc/0x150[<ffff0000084c6670>] regmap_write+0x48/0x70…
0-0058: i2c write error ret=-110

Fault-injectionまとめ

少し経過してからない変更して状態を発生させるで制御動作状態を発生させるを上げる動的に状態を発生させるに参加変更して状態を発生させるで制御きるように参加なる
簡易なインターフェースで柔軟に発生条件を設なインターフェースで制御柔軟に発生条件を設に参加発に参加生しない状況をテスト条件に従ってを上げる設
定した値をで制御きる
エラー処理など通常は発生しない状況をテストがきちんとチェックで制御きる

参考



https://www.static.linuxfound.org/jp_uploads/
seminar20070710/LinuxFaultInjection-2.pdf
Linux kernel source codeDocumentation/fault-injection/fault-injection.txt