Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

割り込み要求のインタフェース

ドライバは、次のインタフェースを使用して、システムからの割り込みベクターを要求する必要があります。

表 8-2  割り込みベクター要求のインタフェース
インタフェース
データ構造体
説明
ddi_intr_alloc()
ddi_intr_handle_t
割り込みを割り当てます。
ddi_intr_set_nreq()
要求する割り込みベクターの数を変更します。

割り込みの割り当て

最初に割り込みを割り当てるときは、 ddi_intr_alloc(9F) 関数を使用します。

int
ddi_intr_alloc (dev_info_t *dip, ddi_intr_handle_t *h_array, int type,
                int inum, int count, int *actualp, int behavior);

ドライバは、この関数を呼び出す前に、要求する数の割り込みを格納するのに十分な大きさの空のハンドル配列を割り当てる必要があります。ddi_intr_alloc() 関数は、count 個の割り込みハンドルを割り当てて、inum パラメータで指定されたオフセットから始まる割り当て済みの割り込みベクターを使って配列を初期化しようとします。actualp パラメータは、割り当てられた割り込みベクターの実際の数を返します。

    ドライバは、次の 2 つの方法で ddi_intr_alloc() 関数を使用できます。

  • ドライバは、ddi_intr_alloc() 関数を複数回呼び出して、割り込みハンドル配列の個々のメンバーに別々の手順で割り込みベクターを割り当てることができます。

  • ドライバは、ddi_intr_alloc() 関数を 1 回呼び出して、デバイスのすべての割り込みベクターを一度に割り当てることができます。

割り込みリソース管理機能を使用している場合は、 ddi_intr_alloc() を 1 回呼び出して、すべての割り込みベクターを一度に割り当てます。count パラメータは、ドライバが要求する割り込みベクターの合計数です。actualp の値が count の値より小さい場合、システムは要求を完全に満たすことはできません。割り込みリソース管理機能では、この要求 (countnreq になる - 下記を参照) を保存するため、あとでさらに多くの割り込みベクターをこのドライバに割り当てることができるようになる場合があります。


注 - 割り込みリソース管理機能を使用すると、ddi_intr_alloc() を追加で呼び出しても、要求される割り込みベクターの合計数は変化しません。要求する割り込みベクターの数を変更するときは、ddi_intr_set_nreq(9F) 関数を使用します。

要求する割り込みベクターの数の変更

要求する割り込みベクターの数を変更するときは、 ddi_intr_set_nreq(9F) 関数を使用します。

int
ddi_intr_set_nreq (dev_info_t *dip, int nreq);

割り込みリソース管理機能が利用できるとき、ドライバは ddi_intr_set_nreq() 関数を使用して、要求する割り込みベクターの合計数を動的に調整できます。ドライバは、ドライバが接続されると存在するようになる実際のロードに応答してこれを行うことができます。

ドライバは、最初に ddi_intr_alloc(9F) を呼び出して、割り込みベクターの最初の数を要求する必要があります。ddi_intr_alloc() 呼び出しのあとで、ドライバは ddi_intr_set_nreq() を呼び出してその要求サイズをいつでも変更できます。指定した nreq 値は、ドライバの、要求する割り込みベクターの新しい合計数です。割り込みリソース管理機能では、この新しい要求に応答して、システムの各ドライバに割り当てられた割り込みの数のバランスをとり直すことがあります。割り込みリソース管理機能によって、ドライバに割り当てられた割り込みの数のバランスがとり直されると、影響を受ける各ドライバは常に、ドライバが使用可能な割り込みベクターが増えたまたは減ったというコールバック通知を受信します。

たとえば、処理中の特定のトランザクションに関連して割り込みを使用する場合、ドライバは要求する割り込みベクターの合計数を動的に調整することがあります。ストレージドライバは、DMA エンジンを進行中の各トランザクションに関連付け、その理由で割り込みベクターを要求することがあります。ドライバは、open(9F) および close(9F) ルーチンで ddi_intr_set_nreq() を呼び出して、ドライバの実際の使用に応じて割り込みの使用率を調整することがあります。

割り込みの使用率と柔軟性

多数の異なる割り込み条件をサポートするデバイスのドライバは、それらの条件を任意の数の割り込みベクターにマッピングできる必要があります。そのようなドライバは、割り当てられる割り込みベクターが利用可能なままであると想定することはできません。現在利用可能な一部の割り込みは、システム内のほかのドライバの必要に対応するため、あとでシステムによって元に戻されることがあります。

    ドライバは、次のことができる必要があります。

  • ハードウェアがサポートする割り込みの数を判定する。

  • 使用に適した割り込みの数を判定する。たとえば、システムのプロセッサの合計数がこの評価に影響することがあります。

  • 必要な割り込みの数と、指定された任意の時点で利用可能な割り込みの数とを比較する。

まとめると、ドライバは、一連の割り込み処理関数を選択し、ハードウェアをプログラムして必要性と割り込みの可用性に応じて割り込みを生成できる必要があります。場合によっては、複数の割り込みが同じベクターのターゲットになることがあります。また、その割り込みベクターの割り込みハンドラは、発生した割り込みを判定する必要があります。デバイスのパフォーマンスは、ドライバが割り込みベクターに割り込みをマッピングする能力の影響を受けることがあります。