ITHREAD(9) | FreeBSD Kernel Developer's Manual | ITHREAD(9) |
名称
ithread_add_handler, ithread_create, ithread_destroy, ithread_priority, ithread_remove_handler, ithread_schedule — カーネル割り込みスレッド書式
#include < sys/param.h>#include < sys/bus.h>
#include < sys/interrupt.h>
int
ithread_add_handler( struct ithd *ithread, const char *name, driver_intr_t handler, void *arg, u_char pri, enum intr_type flags, void **cookiep);
int
ithread_create( struct ithd **ithread, int vector, int flags, void (*disable)(int), void (*enable)(int), const char *fmt, ...);
int
ithread_destroy( struct ithd *ithread);
u_char
ithread_priority( enum intr_type flags);
int
ithread_remove_handler( void *cookie);
int
ithread_schedule( struct ithd *ithread, int do_switch);
解説
割り込みスレッドは、ハードウェアかソフトウェア割り込みのどちらかで引き起こされるとき、ハンドラのリストを実行するカーネルスレッドです。各割り込みハンドラには、名前、ハンドラ関数、ハンドラ引数、優先順位、と様々なフラグがあります。各割り込みスレッドは、優先順位によってソートされたハンドラのリストを保守します。これは、低い優先順序のハンドラの前に高い優先順序のハンドラが実行されることとなります。各スレッドは、そのプロセスの優先順序のために高い優先順序のハンドラの優先順序、またはハンドラがなければ、 PRIO_MAX の優先順序を仮定します。割り込みスレッドは、また、ベクトル番号として表現される単一の割り込みソースに関連しています。ithread_create() 関数は、新しい割り込みスレッドを作成します。 ithread 引数は、成功すれば、新たに作成されたスレッドを指す struct ithd ポインタを指します。 vector 引数は、このスレッドに関連する割り込みソースを指定します。 flags 引数は、このスレッドの特性のマスクです。 ithread_create() のための唯一の現在有効なフラグは、この割り込みスレッドがソフトウェア割り込みであることを指定する IT_SOFT です。 enable と disable 引数は、この割り込みスレッドの割り込みソースを有効にして、無効にするために使用されるオプションの関数を指定します。関数は、それらの唯一の引数としてスレッドの割り込みソースに対応するベクトルを受け取ります。残っている引数は、新しい ithread のベース名を構築するために使用される printf(9) 引数のリストを形成します。割り込みスレッドのフルネームは、割り込みハンドラのすべての名前で割り込みスレッドのベース名を連結することによって形成されます。
ithread_destroy() 関数は、リソースを解放して、裏打ち (backing) 支援カーネルスレッドが終了するように手配することによって、以前に作成された割り込みスレッドを破壊します。割り込みスレッドは、どんなハンドラも残っていなければ、破壊することができます。
ithread_add_handler() 関数は、 ithread によって指定された既存の割り込みスレッドに新しいハンドラを追加します。 name 引数は、このハンドラのための名前を指定します。 handler と arg 引数は、このハンドラを実行する関数と、それに渡す引数を与えます。 pri 引数は、このハンドラの優先順位を指定して、このスレッドのための他のハンドラに関連しているものをソートし、裏打ちカーネルスレッドの優先順位を指定するために使用されます。 flags 引数は、 < sys/bus.h> で定義されるようにこのハンドラの特性を指定するために使用することができます。 cookiep が NULL でないなら、後でこのハンドラを取り除くために使用することができるクッキーにそれを割り当てられます。
ithread_remove_handler() は、割り込みスレッドからハンドラを取り除きます。 cookie 引数は、スレッドから取り除くためのハンドラを指定します。
ithread_schedule() 関数は、実行する割り込みスレッドをスケジュールします。 do_switch 引数が 0 でなく、割り込みスレッドがアイドルでないなら、実行キューで割り込みスレッドを置いた後に、コンテキストは、強制的にスイッチされます。
ithread_priority() 関数は、 INTR_TYPE_* 割り込みフラグを割り込みハンドラ優先順位に変換します。
特定の割り込み ( INTR_TYPE_*) のタイプに関連しない割り込みフラグは、ハードウェアとソフトウェアの割り込みハンドラの両方の追加特性を指定するために使用することができます。 INTR_EXCL フラグは、このハンドラが別のハンドラで割り込みスレッドを共有することができないことを指定します。 INTR_MPSAFE フラグは、それが実行されている間に、Giant ミューテックスが保持される必要はないので、このハンドラが MP 安全であると指定します。 INTR_ENTROPY フラグは、このハンドラが結合される割り込みソースがエントロピの良いソースであり、従って、ハンドラのソースの引き金からの割り込みであるとき、エントロピが集められるべきであると指定します。現在、 INTR_ENTROPY フラグは、ソフトウェア割り込みハンドラのために有効ではありません。
割り込みスレッドでスリープ (sleep) することは許可されていません。したがって、割り込みスレッドの任意のメモリまたは 0 の割り付けは、 M_NOWAIT フラグの設定で指定されるべきです。その後、任意の割り付けエラーを操作しなければなりません。
戻り値
ithread_add_handler(), ithread_create(), ithread_destroy(), ithread_remove_handler() と ithread_schedule() 関数は、成功すれば 0 を、失敗すれば 0 以外を返します。 ithread_priority() 関数は、割り込みフラグに渡すために対応するプロセスの優先順位を返します。使用例
swi_add() 関数は、 ithread_create() と ithread_add_handler() の使用を示します。
int swi_add(struct ithd **ithdp, const char *name, driver_intr_t handler, void *arg, int pri, enum intr_type flags, void **cookiep) { struct proc *p; struct ithd *ithd; int error; if (flags & INTR_ENTROPY) return (EINVAL); ithd = (ithdp != NULL) ? *ithdp : NULL; if (ithd != NULL) { if ((ithd->it_flags & IT_SOFT) == 0) return(EINVAL); } else { error = ithread_create(&ithd, pri, IT_SOFT, NULL, NULL, "swi%d:", pri); if (error) return (error); if (ithdp != NULL) *ithdp = ithd; } return (ithread_add_handler(ithd, name, handler, arg, pri + PI_SOFT, flags, cookiep)); }
エラー
ithread_add_handler() 関数は、次の場合に失敗します:- [ EINVAL]
- ithread, handler または name 引数のいずれかが NULL です。
- [ EINVAL]
- INTR_EXCL フラグが指定され、割り込みスレッド ithread には、既に少なくとも 1 つのハンドラがあるか、または割り込みスレッド ithread には、既に排他的なハンドラがあります。
- [ ENOMEM]
- このハンドラのために必要なメモリを割り付けることができませんでした。
ithread_create() 関数は、次の場合に失敗します:
- [ EAGAIN]
- 実行でのプロセスの合計数がシステムで課された制限を超えました。制限は、 sysctl(3) MIB 変数 KERN_MAXPROC によって与えられます。
- [ EINVAL]
- IT_SOFT 以外のフラグが flags パラメータで指定されました。
- [ ENOMEM]
- この割り込みスレッドのために必要なメモリを割り付けることができませんでした。
ithread_destroy() 関数は、次の場合に失敗します:
- [ EINVAL]
- ithread 引数が NULL です。
- [ EINVAL]
- ithread によって指された割り込みスレッドには、少なくとも 1 つのハンドラがあります。
ithread_remove_handler() 関数は、次の場合に失敗します:
- [ EINVAL]
- cookie 引数が NULL です。
ithread_schedule() 関数は、次の場合に失敗します:
- [ EINVAL]
- ithread 引数が NULL です。
- [ EINVAL]
- ithread によって指された割り込みスレッドには、割り込みハンドラがありません。
歴史
割り込みスレッドとそれらに対応する API は、 FreeBSD 5.0 ではじめて登場しました。バグ
現在の struct ithd は、割り込みソースと割り込みスレッドの両方を表します。 ithread が参照を保持する関数などを有効にして、無効にする、ベクトル番号を含む別々の struct isrc があるべきです。August 25, 2006 | FreeBSD |