EN JA
WITNESS(4)
WITNESS(4) FreeBSD Kernel Interfaces Manual WITNESS(4)

名称

witnessロック検証機能

書式

options WITNESS
options WITNESS_KDB
options WITNESS_SKIPSPIN

解説

witness モジュールは、各スレッドによるロックの取得と開放の経過を追います。それは、また、互いに取得されるロックの順序の経過を追います。ロックが取得されるたびに、 witness は、ロックが間違った順序で取得されていないかを確かめるためにこれらの 2 つのリストを使用します。ロックの順序違反が検出されるなら、メッセージは、問題となっているロックの関連と位置の詳細をカーネルコンソールに出力します。また、 witness は、順序違反が起こるとき、カーネルデバッガに落とすように設定することもできます。

また、 witness コードは、非再帰的なロックで再帰的に処理しないことを検証するような、他の様々な状態をチェックするか、または別のスレッドによって保持される共有されるロックでアップグレードを試みます。これらのチェックのどれかが失敗するなら、カーネルは、パニックします。

ロック順序違反が検出されるとき、カーネルデバッガに入るかどうかを制御するフラグは、さまざまな方法で設定することができます。デフォルトで、フラグは、オフですが、 WITNESS_KDB カーネルオプションが指定されるなら、フラグは、デフォルトでオンです。また、 debug.witness.kdb 環境変数またはカーネルが debug.witness.kdb sysctl を通してブートした後に loader(8) からそれを設定することができます。フラグが 0 に設定されるなら、デバッガには入りません。フラグが 0 でなければ、デバッガに入ります。

また、 witness コードは、スピンミューテックス (mutex) でのすべてのチェックをスキップするために設定することができます。デフォルトでは、このフラグは、デフォルトでオフですが、 WITNESS_SKIPSPIN カーネルオプションを指定することによって、変更することができます。また、 loader(8) 環境変数 debug.witness.skipspin を通してフラグを設定することができます。変数が 0 以外の値に設定されるなら、スピンミューテックス (mutex) は、スキップされます。カーネルがいったんブートすると、このフラグの状態は、検査できますが、読み込み専用 sysctl debug.witness.skipspin を通して設定することはできません。

sysctl debug.witness.watch は、システムの目撃の関与のレベルを指定します。 1 の値は、目撃が有効にされると指定します。 0 の値は、目撃が無効にされると指定しますが、再びそれを有効にすることができます。これは、システムに少量のオーバヘッドをもたらします。 -1 の値は、witness が永久に無効にされると指定し、再び有効にすることができません。 sysctl debug.witness.watch は、 loader(8) を通して設定することができます。

また、 witness コードは、 witnessddb(4) の両方がカーネルにコンパイルされるなら、2 つの特別の ddb(4) コマンドを提供します:

show locks [ thread]
各ロックがスレッドによって最後に獲得されたファイル名と行番号とともに、スレッドによって保持されたロックのリストをカーネルコンソールに出力します。オプションの thread 引数は、TID、PID またはスレッドの構造体へのポインタのいずれかを指定できます。 thread が指定されないなら、現在のスレッドによって保持されたロックが表示されます。
show all locks
システム中のすべてのスレッドによって保持されたロックのリストをカーネルコンソールに出力します。
show witness
現在の順序リストをカーネルコンソールにダンプします。コードは、スリープロックのすべてのためのロック順序ツリーを最初に表示します。そして、スピンロックのすべてのためのロック順序ツリーを表示します。最終に、まだ取得されていないロックのリストを表示します。

歴史

witness コードは、 BSD/OS 5.0 ではじめて登場し、そこから FreeBSD 5.0 に取り込まれました。
May 30, 2012 FreeBSD