EN JA
SWI(9)
SWI(9) FreeBSD Kernel Developer's Manual SWI(9)

名称

swi_add, swi_remove, swi_schedソフトウェア割り込みハンドラを登録して、スケジュールする

書式

#include < sys/param.h>
#include < sys/bus.h>
#include < sys/interrupt.h>

extern struct intr_event *tty_intr_event;
extern struct intr_event *clk_intr_event;
extern void *vm_ih;

int
swi_add( struct intr_event **eventp, const char *name, driver_intr_t handler, void *arg, int pri, enum intr_type flags, void **cookiep);

int
swi_remove( void *cookie);

void
swi_sched( void *cookie, int flags);

解説

これらの関数は、ソフトウェア割り込みハンドラを登録してスケジュールするために使用されます。ソフトウェア割り込みハンドラは、ちょうどハードウェア割り込みハンドラがハードウェア割り込みスレッドにアタッチされるように、ソフトウェア中断スレッドにアタッチされます。複数のハンドラは、同じスレッドにアタッチすることができます。ソフトウェア割り込みハンドラは、後で仕事を行うことができるようにハードウェア割り込みハンドラのそれほど重要でない処理内部のキューを作るために使用することができます。ソフトウェア割り込みスレッドは、割り込みスレッドとして取り扱われるという点において他のカーネルスレッドと異なっています。これは、これらのスレッドが割り込み時間としてカウントされ実行して費やされた時間であり、ライトウェート (軽い) コンテキストスイッチを通してそれらを実行することができることを意味します。

swi_add() 関数は、新しいソフトウェア割り込みハンドラを指定された割り込みのイベントに追加するために使用されます。 eventp 引数は、 struct intr_event ポインタへの省略可能なポインタです。この引数が割り込みハンドラのリストを保持する既存のイベントを指すなら、このハンドラは、そのイベントにアタッチされます。そうでなければ、新しいイベントが作成され、 eventpNULL でなければ、そのアドレスへのポインタが、新しく作成されたイベントを指すために修正されます。 name 引数は、特有のハンドラの名前を関連づけるために使用されます。この名前は、このハンドラがアタッチされたソフトウェア割り込みスレッドの名前に追加されます。 handler 引数は、ハンドラが実行するようにスケジュールされるとき、実行される関数です。 arg パラメータは、関数が実行されるとき、唯一のパラメータとして handler に渡されます。 pri 値は、他のソフトウェア割り込みハンドラに対するこの割り込みハンドラの優先順位を指定します。割り込みイベントが作成されるなら、この値は、ベクトルとして使用され、 flags 引数は、 INTR_MPSAFE のようなハンドラの属性を指定するために使用されます。 cookiep 引数は、 void * クッキーを指します。このクッキーは、このハンドラをユニークに識別する値に設定され、実行のために後でハンドラをスケジュールするために使用されます。

swi_remove() 関数は、 cookie 引数によって指された割り込みハンドラを分解 (teardown) するために使用されます。それは、関連する割り込みイベントから割り込みハンドラをデタッチし、そのメモリを解放します。

swi_sched() 関数は、割り込みハンドラと実行するその関連スレッドをスケジュールするために使用されます。 cookie 引数は、どのソフトウェア割り込みハンドラが実行するようにスケジュールされるべきであるか指定します。 flags 引数は、次のフラグの 1 つ以上のマスクで、どのように、いつハンドラが実行されるべきであるかを指定します:

SWI_DELAY
カーネルは、実行する必要がある指定されたハンドラをマークするべきですが、カーネルは、実行するソフトウェア割り込みスレッドをスケジュールするべきでないと指定します。代わりに、 handler は、ソフトウェア割り込みスレッドが別のイベントによってスケジュールされた後に実行する次にときに実行されます。クロックソフトウェア割り込みスレッドをアタッチして、スケジュールするときこのフラグを使用して、ソフトウェア割り込みハンドラは、 FreeBSD の以前のバージョンで setdelayed() によって実行された機能を実装するために使用することができます。

tty_intr_eventclk_intr_event 変数は、それぞれ、tty のためのソフトウェア割り込みハンドラとクロックソフトウェア割り込みへのポインタを含みます。 tty_intr_event は、同じスレッドの tty ソフトウェア割り込みハンドラをハングオフするために使用されます。訳注) ハングオフの意味不明。 clk_intr_event は、 setdelayed() の機能性を SWI_DELAY に関連して取得することができるように、クロックソフトウェア割り込みスレッドの遅延されたハンドラをハングオフするために使用されます。 vm_ih ハンドラクッキーは、VM サブシステムのために実行するソフトウェア割り込みスレッドをスケジュールするために使用されます。

戻り値

swi_add() と swi_remove() 関数は、成功すれば 0 を、失敗すれば 0 以外を返します。

エラー

swi_add() 関数は、次の場合に失敗します:
[ EAGAIN]
実行プロセスの合計数がシステムで課された制限を超えています。制限は、 sysctl(3) MIB 変数 KERN_MAXPROC によって与えられます。
[ EINVAL]
flags 引数が、 INTR_ENTROPY を指定しています。
[ EINVAL]
eventp 引数が、ハードウェア割り込みスレッドを指しています。
[ EINVAL]
name または handler のいずれかの引数が NULL です。
[ EINVAL]
INTR_EXCL フラグが指定され、 eventp によって指された割り込みイベントには、既に少なくとも 1 つのハンドラがあるか、または、割り込みイベントには、すでに排他的なハンドラがあります。

swi_remove() 関数は、次の場合に失敗します:

[ EINVAL]
cookie によって指されるソフトウェア割り込みハンドラが NULL です。

関連項目

ithread(9), taskqueue(9)

歴史

swi_add() と swi_sched() 関数は、 FreeBSD 5.0 ではじめて登場しました。それらは、 FreeBSD 3.0 で登場した register_swi() 関数と少なくとも 4.4BSD までさかのぼる setsoft*() と schedsoft*() 関数を置き換えました swi_remove() 関数は、 FreeBSD 6.1 ではじめて登場しました。

バグ

このマニュアルページで説明されたブローバル変数の大部分は、グローバルとなるべきでないか、または少なくとも < sys/interrupt.h> で宣言するべきではありません。
April 19, 2012 FreeBSD