(57)【特許請求の範囲】
【請求項１】
待ち時間低減パケット処理のためのシステムであって、
固有ソケットリストを維持するように構成されたシステムコールモジュールであり、前記固有ソケットリストは、１つ又は複数のデバイスキューのための１つ又は複数のエントリを含み、各エントリは、デバイスキューと該デバイスキューに関連付けられた単一のソケットである固有ソケットとを識別し、前記固有ソケットは、パケットを受信するように構成された複数のソケットから選択される、システムコールモジュールと、
前記固有ソケットリスト上の前記１つ又は複数のデバイスキューをビジーポーリングするように構成された待ち時間低減ビジーポーリングモジュールと、
前記複数のソケットのうち１つからパケットを受信するように構成されたネットワークスタックモジュールと、
を含み、
前記システムコールモジュールは、前記の受信されたパケットが前記待ち時間低減ビジーポーリングモジュールによって提供されたと検出したことに応答して、前記固有ソケットリストを更新しないと判定するようにさらに構成され、
前記システムコールモジュールは、前記の受信されたパケットが割り込み処理モジュールによって提供されたと検出したことに応答して、前記固有ソケットリストを更新するようにさらに構成され、前記更新は、
前記の受信されたパケットに関連付けられたデバイスキューを識別すること、
前記の受信されたパケットに関連付けられたソケットを識別すること、及び
前記の識別されたデバイスキューが前記固有ソケットリスト上の前記１つ又は複数のエントリのうちの１つにない場合に、前記固有ソケットリスト上に新しいエントリを作成することであって、前記新しいエントリは、前記の識別されたデバイスキューと前記の識別されたソケットとを含む、こと、
を含む、
システム。
【請求項２】
前記システムコールモジュールは、前記割り込み処理モジュールによって提供される、２番目の連続して受信されるパケットの検出まで、前記固有ソケットリストの前記更新を遅延させるようにさらに構成される、請求項１に記載のシステム。
【請求項３】
前記システムコールモジュールは、
ソケットとデバイスキューとの間の関連付けにおける変更を検出し、
前記の変更されたソケットが前記固有ソケットリスト上の前記１つ又は複数のエントリのうちの１つにあるかどうかを判定し、
前記判定に応答して、前記固有ソケットリストから、前記の変更されたソケットを含むエントリを削除する
ようにさらに構成される、請求項１に記載のシステム。
【請求項４】
前記割り込み処理モジュールは、タイマ駆動である、請求項１に記載のシステム。
【請求項５】
前記固有ソケットリスト上の前記１つ又は複数のデバイスキューへのイベント又はパケットの到着に応答して通知を生成するように構成されたハードウェアイベントキュー、をさらに含み、前記待ち時間低減ビジーポーリングモジュールは、前記通知を受信するようにさらに構成される、請求項１に記載のシステム。
【請求項６】
前記待ち時間低減ビジーポーリングモジュールは、前記ハードウェアイベントキューを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行するようにさらに構成され、前記ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、前記プロセッサをスリープ状態に移行するように構成され、前記スリープ状態は、前記ハードウェアイベントキューの変化に応答して終了する、請求項５に記載のシステム。
【請求項７】
ステータスビットを含むステータスレジスタ、をさらに含み、前記ステータスビットの各々は、前記固有ソケットリスト上のデバイスキューに関連付けられ、前記ステータスビットは、前記固有ソケットリスト上の前記１つ又は複数のデバイスキューへのイベント又はパケットの到着を示すように設定され、前記待ち時間低減ビジーポーリングモジュールは、前記ステータスレジスタを監視するようにさらに構成される、請求項１に記載のシステム。
【請求項８】
前記待ち時間低減ビジーポーリングモジュールは、前記ステータスレジスタを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行するようにさらに構成され、前記ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、前記プロセッサをスリープ状態に移行するように構成され、前記スリープ状態は、前記ステータスビットの変化に応答して終了する、請求項７に記載のシステム。
【請求項９】
プロセッサが、前記ネットワークスタックモジュールを実施するように構成され、前記プロセッサは、ダイレクトメモリアクセス（ＤＭＡ）エンジンを含むネットワークインタフェースモジュールに結合される、請求項１に記載のシステム。
【請求項１０】
プロセッサに待ち時間低減パケット処理のための動作を実行させるコンピュータプログラムであって、前記動作は、
固有ソケットリストを維持する動作であり、前記固有ソケットリストは、１つ又は複数のデバイスキューのための１つ又は複数のエントリを含み、各エントリは、デバイスキューと該デバイスキューに関連付けられた単一のソケットである固有ソケットとを識別し、前記固有ソケットは、パケットを受信するように構成された複数のソケットから選択される、動作と、
前記固有ソケットリスト上の前記１つ又は複数のデバイスキューをビジーポーリングする動作と、
前記複数のソケットのうち１つからパケットを受信する動作と、
前記の受信されたパケットが前記ビジーポーリングする動作によって提供されたと検出したことに応答して、前記固有ソケットリストを更新しないと判定する動作と、
前記の受信されたパケットが割り込み処理モジュールによって提供されたと検出したことに応答して、前記固有ソケットリストを更新する動作であり、該更新する動作は、
前記の受信されたパケットに関連付けられたデバイスキューを識別すること、
前記の受信されたパケットに関連付けられたソケットを識別すること、及び
前記の識別されたデバイスキューが前記固有ソケットリスト上の前記１つ又は複数のエントリのうちの１つにない場合に、前記固有ソケットリスト上に新しいエントリを作成することであって、前記新しいエントリは、前記の識別されたデバイスキューと前記の識別されたソケットとを含む、こと、
を含む、動作と、
を含む、コンピュータプログラム。
【請求項１１】
前記割り込み処理モジュールによって提供される、２番目の連続して受信されるパケットの検出まで、前記固有ソケットリストの前記更新する動作を遅延させる動作、をさらに含む請求項１０に記載のコンピュータプログラム。
【請求項１２】
ソケットとデバイスキューとの間の関連付けにおける変更を検出する動作と、
前記の変更されたソケットが前記固有ソケットリスト上の前記１つ又は複数のエントリのうちの１つにあるかどうかを判定する動作と、
前記判定に応答して、前記固有ソケットリストから、前記の変更されたソケットを含むエントリを削除する動作と、
をさらに含む請求項１０に記載のコンピュータプログラム。
【請求項１３】
前記割り込み処理モジュールは、タイマ駆動である、請求項１０に記載のコンピュータプログラム。
【請求項１４】
前記固有ソケットリスト上の前記１つ又は複数のデバイスキューへのイベント又はパケットの到着に応答して通知を生成するように構成されたハードウェアイベントキューから前記通知を受信する動作、をさらに含む請求項１０に記載のコンピュータプログラム。
【請求項１５】
前記ハードウェアイベントキューを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行する動作、をさらに含み、前記ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、前記プロセッサをスリープ状態に移行するように構成され、前記スリープ状態は、前記ハードウェアイベントキューの変化に応答して終了する、請求項１４に記載のコンピュータプログラム。
【請求項１６】
ステータスレジスタを監視する動作、をさらに含み、前記ステータスレジスタは、ステータスビットを含み、前記ステータスビットの各々は、前記固有ソケットリスト上のデバイスキューに関連付けられ、前記ステータスビットは、前記固有ソケットリスト上の前記１つ又は複数のデバイスキューへのイベント又はパケットの到着を示すように設定される、請求項１０に記載のコンピュータプログラム。
【請求項１７】
前記ステータスレジスタを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行する動作、をさらに含み、前記ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、前記プロセッサをスリープ状態に移行するように構成され、前記スリープ状態は、前記ステータスビットの変化に応答して終了する、請求項１６に記載のコンピュータプログラム。
【請求項１８】
プロセッサに待ち時間低減パケット処理のための動作を実行させるコンピュータプログラムであって、前記動作は、
１又は複数のデバイスキューのための１つ又は複数のエントリを含むハッシュテーブルを維持する動作であり、前記ハッシュテーブルは、デバイスキューを、該デバイスキューに関連付けられた単一のソケットである固有ソケットに、及び該デバイスキューに関連付けられたさらなるソケットの衝突リストにマップするように構成される、動作と、
前記ハッシュテーブル上の前記１つ又は複数のデバイスキューをビジーポーリングする動作と、
パケット又はイベントが前記ビジーポーリングする動作によって提供されたと検出したことに応答して、前記ハッシュテーブルを更新しないと判定する動作と、
ポーリングシステムコールから新しいソケット登録を受信する動作と、
前記新しいソケットに関連付けられたデバイスキューを識別する動作と、
前記の識別されたデバイスキューが前記ハッシュテーブル内にない場合に、
前記の識別されたデバイスキューについて、前記ハッシュテーブル内に新しいエントリを作成する動作であり、前記新しいエントリは、前記新しいソケットを前記固有ソケットとして含み、空の衝突リストをさらに含む、動作と、
前記の識別されたデバイスキューが前記ハッシュテーブル内にある場合に、
前記ハッシュテーブル内の前記の識別されたデバイスキューについての衝突リストに前記新しいソケットを追加する動作と、
を含む、コンピュータプログラム。
【請求項１９】
ソケットとデバイスキューとの間の関連付けにおける変更を検出する動作と、
前記の変更されたソケットが前記デバイスキューに関連付けられた衝突リスト上にある場合に、前記衝突リストから前記の変更されたソケットを削除する動作と、
前記の変更されたソケットが前記デバイスキューに関連付けられた固有ソケットであり、かつ前記デバイスキューに関連付けられた衝突リストが空である場合に、前記デバイスキューについて、前記ハッシュテーブル内のエントリを抹消する動作と、
前記の変更されたソケットが前記デバイスキューに関連付けられた固有ソケットであり、かつ前記デバイスキューに関連付けられた衝突リストが空でない場合に、前記デバイスキューに関連付けられた固有ソケットを、該衝突リスト上のソケットのうちの１つで置換する動作と、
をさらに含む請求項１８に記載のコンピュータプログラム。
【請求項２０】
前記ハッシュテーブル上の前記１つ又は複数のデバイスキューへのイベント又はパケットの到着に応答して通知を生成するように構成されたハードウェアイベントキューから前記通知を受信する動作、をさらに含む請求項１８に記載のコンピュータプログラム。
【請求項２１】
前記ハードウェアイベントキューを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行する動作、をさらに含み、前記ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、前記プロセッサをスリープ状態に移行するように構成され、前記スリープ状態は、前記ハードウェアイベントキューの変化に応答して終了する、請求項２０に記載のコンピュータプログラム。
【請求項２２】
ステータスレジスタを監視する動作、をさらに含み、前記ステータスレジスタは、ステータスビットを含み、前記ステータスビットの各々は、前記ハッシュテーブル上のデバイスキューに関連付けられ、前記ステータスビットは、前記ハッシュテーブル上の前記１つ又は複数のデバイスキューへのイベント又はパケットの到着を示すように設定される、請求項１８に記載のコンピュータプログラム。
【請求項２３】
前記ステータスレジスタを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行する動作、をさらに含み、前記ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、前記プロセッサをスリープ状態に移行するように構成され、前記スリープ状態は、前記ステータスビットの変化に応答して終了する、請求項２２に記載のコンピュータプログラム。
【請求項２４】
待ち時間低減パケット処理のための方法であって、
固有ソケットリストを維持するステップであり、前記固有ソケットリストは１つ又は複数のデバイスキューのための１つ又は複数のエントリを含み、各エントリは、デバイスキューと該デバイスキューに関連付けられた単一のソケットである固有ソケットとを識別し、前記固有ソケットは、パケットを受信するように構成された複数のソケットから選択される、ステップと、
前記固有ソケットリスト上の前記１つ又は複数のデバイスキューをビジーポーリングするステップと、
前記複数のソケットのうち１つからパケットを受信するステップと、
前記の受信されたパケットが前記ビジーポーリングするステップによって提供されたと検出したことに応答して、前記固有ソケットリストを更新しないと判定するステップと、
前記の受信されたパケットが割り込み処理モジュールによって提供されたと検出したことに応答して、前記固有ソケットリストを更新するステップであり、該更新するステップは、
前記の受信されたパケットに関連付けられたデバイスキューを識別すること、
前記の受信されたパケットに関連付けられたソケットを識別すること、及び
前記の識別されたデバイスキューが前記固有ソケットリスト上の前記１つ又は複数のエントリのうちの１つにない場合に、前記固有ソケットリスト上に新しいエントリを作成することであって、前記新しいエントリは、前記の識別されたデバイスキューと前記の識別されたソケットとを含む、こと
を含む、ステップと、
を含む方法。
【請求項２５】
前記割り込み処理モジュールによって提供される、２番目の連続して受信されるパケットの検出まで、前記固有ソケットリストの前記更新するステップを遅延させるステップ、をさらに含む請求項２４に記載の方法。
【請求項２６】
ソケットとデバイスキューとの間の関連付けにおける変更を検出するステップと、
前記の変更されたソケットが前記固有ソケットリスト上の前記１つ又は複数のエントリのうちの１つにあるかどうかを判定するステップと、
前記判定に応答して、前記固有ソケットリストから、前記の変更されたソケットを含むエントリを削除するステップと、
をさらに含む請求項２４に記載の方法。
【請求項２７】
前記固有ソケットリスト上の前記１つ又は複数のデバイスキューへのイベント又はパケットの到着に応答して通知を生成するように構成されたハードウェアイベントキューから前記通知を受信するステップ、をさらに含む請求項２４に記載の方法。
【請求項２８】
前記ハードウェアイベントキューを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行するステップ、をさらに含み、前記ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、前記プロセッサをスリープ状態に移行するように構成され、前記スリープ状態は、前記ハードウェアイベントキューの変化に応答して終了する、請求項２７に記載の方法。
【請求項２９】
ステータスレジスタを監視するステップ、をさらに含み、前記ステータスレジスタは、ステータスビットを含み、前記ステータスビットの各々は、前記固有ソケットリスト上のデバイスキューに関連付けられ、前記ステータスビットは、前記固有ソケットリスト上の前記１つ又は複数のデバイスキューへのイベント又はパケットの到着を示すように設定される、請求項２４に記載の方法。
【請求項３０】
前記ステータスレジスタを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行するステップ、をさらに含み、前記ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、前記プロセッサをスリープ状態に移行するように構成され、前記スリープ状態は、前記ステータスビットの変化に応答して終了する、請求項２９に記載の方法。
【請求項３１】
請求項１０乃至２３のうちいずれか１項記載のコンピュータプログラムを記憶したコンピュータ読取可能記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、パケット処理に関し、より具体的には、ネットワーク接続の数の増加における待ち時間低減パケット処理のための、ソケットと関連するデバイスキューとの管理に関する。
【背景技術】
【０００２】
ネットワークインタフェースは、一般に、ネットワークとホストシステムとの間で、データパケット転送能力を提供する。ホストシステムは、ネットワークインタフェースと、データパケットを作り出し消費するオペレーティングシステムの上位レイヤ又はユーザアプリケーション／プログラムとの間に、ドライバモジュールを採用することができる。ネットワークインタフェースは、通常、ドライバモジュールに対して割り込みを生成して、ドライバモジュールの留意を必要とし得る状況、例えば、データ転送の完了及び／又はデバイスキュー内に新たに受信されたパケットが利用できることをシグナルで知らせる。それから、ドライバモジュール内のネットワークスタック処理が、デバイスキューと上位レイヤとの間の、パケットの配信を取り扱う。いくつかの例において、ドライバスケジューリングが、割り込み駆動ではなく、タイマに基づくことができる。いくつかの環境において、ネットワーク接続は、ネットワークソケット（又は、単にソケット）と呼ばれる抽象的なものとして、システムによって、ユーザアプリケーションに提示されることができる。
【０００３】
割り込みは、しばしば、ネットワークインタフェースとユーザアプリケーションとの間のパケットの転送においてさらなる待ち時間をもたらす。なぜならば、割り込みは、コンテキストスイッチを伴うからである（一般的なスタック処理は、通常、より少ない待ち時間ではなく、より高いスループットに向けて設計される）。待ち時間を低減するいくつかの実装は、システムコール処理（又は、ユーザアプリケーション、若しくはアプリケーションに代わってユーザ空間ライブラリ）によって、ソケットに関連付けられたデバイスキュー上で、ビジーポーリング（busy-polling）を採用している。しかしながら、複数のソケット／接続をサービスしようと試みるとき、ビジーポーリングの効果は、ソケットの数に対して直線的に悪化し、ソケットの数が増加するにつれて、例えば、数百ソケットを上回ると、非実用的に非効率になる。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
こうして、複数のソケット／接続をサービスしようと試みるとき、ビジーポーリングの効果は、ソケットの数に対して直線的に悪化し、ソケットの数が増加するにつれて、例えば、数百ソケットを上回ると、非実用的に非効率になる。
【課題を解決するための手段】
【０００５】
概して、本開示は、パケット処理待ち時間の低減に関して、ソケットと関連するデバイスキューとの管理のためのシステム、方法及びコンピュータ読取可能媒体を提供する。
【図面の簡単な説明】
【０００６】
請求される対象事項の実施形態の特徴及び利点が、下記の発明を実施するための形態を読み進めるにつれて、また図面を参照すると、明らかになるであろう。図面において、同様の番号が同様の部分を表す。
【図１】本開示と調和する１つの例示的実施形態の最上位ブロック図を示す。
【図２】本開示と調和する１つの例示的実施形態のブロック図を示す。
【図３（ａ）】本開示と調和する別の例示的実施形態のブロック図を示す。
【図３（ｂ）】本開示と調和する別の例示的実施形態のブロック図を示す。
【図４】本開示と調和する１つの例示的実施形態の動作のフローチャートを示す。
【図５】本開示と調和する別の例示的実施形態の動作のフローチャートを示す。
【図６】本開示と調和する別の例示的実施形態の動作のフローチャートを示す。
【発明を実施するための形態】
【０００７】
下記の発明を実施するための形態は、例示的な実施形態を参照して進められるものであるが、当業者には、例示的な実施形態の多くの代替、修正、変形が明らかになるであろう。
【０００８】
概して、本開示は、パケット処理待ち時間の低減に関して、ソケットと関連するデバイスキューとの管理のためのシステム、方法及びコンピュータ読取可能媒体を提供する。システムは、データパケットが利用できることなどのネットワークイベントの判定のための複数のパスを提供するように構成されることができる。これらのパスには、待ち時間を低減するビジーポーリングパスと、待ち時間がより多いながらスループットを増加させる割り込み又はタイマ駆動パスとを含むことができる。さらに、システムコールモジュールは、「固有リスト（unique  list）」と呼ばれる、ソケットを固有のアクティブなデバイスキューにマップするリストを、維持するように構成されることができる。コンピューティングシステムプラットフォーム、例えば、多数のユーザコンテキストアプリケーションをホストするコンピューティングシステムプラットフォームは、比較的多数のオープンソケットと比較的多数のハードウェアデバイスキューとを有する場合がある。しかしながら、単一のプロセッサ（又は、利用可能なプロセッサのサブセット）によってサービスされるソケットに関して、通常、どんな時にも使用中であるデバイスキューはごくわずかであり得る。ゆえに、例えば、ソケットの数が何千を超える場合がある一方、これらのソケットは、存在し得る多数のデバイスキュー（可能性として、数百又はさらには数千）のうち、プロセッサにつき１つ又は２つのデバイスキューによってのみサービスされる場合がある。固有リストは、デバイスキューの各々について、デバイスキューと、このキューに関連付けられた多数のソケットから選択された１つのソケットとの間の、リンクを提供する（例えば、このキューを通じてパケットを提供する）。それから、以下でより詳細に説明されるとおり、ビジーポーリングは、効率の増大及び待ち時間の低減のため、固有リスト上のデバイスキューに制限されることができる。というのは、不必要なキューのポーリングは、さらなる時間を消費するからである。
【０００９】
待ち時間低減ビジーポーリングモジュールは、待ち時間を低減しながら、デバイスキューをビジーポーリングして、スタック及びシステムコールモジュールにイベントを「供給する（feed）」ように構成されることができる。現在利用可能なイベントがないとき、ユーザコンテキストアプリケーションからの要求に応答して、例えばＬｉｎｕｘ（登録商標）ＯＳ環境（又は他の適切なオペレーティングシステム）内のｅｐｏｌｌシステムコールといった、システムコールモジュールは、イベントが利用可能になるまで、キューを直接ビジーポーリングすることができ、したがって、このパスに沿って待ち時間を減らすことができる。
【００１０】
本開示に説明される実施形態は、ネットワークインタフェースから受信されたパケットを対象としているが、本明細書に説明される概念は、比較的高いスループットの任意の入力／出力（Ｉ／Ｏ）システム、例えばディスクＩ／Ｏなどに適用されることができることを、十分理解されたい。
【００１１】
図１は、本開示と調和する１つの例示的実施形態の最上位システム図１００を示す。ネットワークインタフェース１０４が、ホストシステム１０６とネットワーク１０２との間でデータを転送するように構成される。ネットワークインタフェース１０４には、一般に、メディアアクセス制御（ＭＡＣ）レイヤプロトコルと物理（ＰＨＹ）レイヤプロトコルとを処理するための回路又はモジュールを含むことができる。ネットワークインタフェース１０４は、さらに、一般に、ダイレクトメモリアクセス（ＤＭＡ）エンジンを含むことができる。データ転送は、双方向であってよい（すなわち、データはネットワークに送信されることができ、かつ／あるいはネットワークから受信されることができる）。ホストシステム１０６は、例えば、デスクトップ、ワークステーション、ラップトップ、タブレット、電話若しくはスマートフォン又は任意の種類の有線若しくは無線プラットフォームを含む、任意の種類のコンピューティングシステム又は通信デバイスを含むことができる。ホストシステム１０６には、任意の数のプロセッサ（ＣＰＵ）１０８、１１０又はプロセッサコアを含むことができる。待ち時間低減デバイスドライバモジュール１１２は、ホストメモリに常駐することができるものであり、ホストシステム１０６上で稼働するオペレーティングシステム（ＯＳ）又は他のソフトウェアとネットワークインタフェース１０４との間のインタフェースを提供することができる。
【００１２】
ドライバモジュール１１２は、以下でより詳細に説明されるとおり、データディスクリプタ、制御レジスタセット、並びに／又は任意の他の適切な制御、通信及び／若しくはイベント掲示（posting）の手段の使用を通じて、ネットワークインタフェース１０４とインタフェースをとることができる。ネットワークインタフェース１０４は、ホストシステム１０６とネットワーク１０２との間のデータの送信及び受信を達成するように構成されたハードウェア、ファームウェア（任意の種類のプログラマブル回路を含む）及び／又はソフトウェアの任意の組み合わせを含むことができる。
【００１３】
図２は、本開示と調和する１つの例示的実施形態のブロック図２００を示す。ネットワークインタフェース１０４が、制御回路２０２とデータキュー２０４との１又は複数の組を含むように示されている。いくつかの実施形態において、データキューは、ホストシステム１０６上のメモリ内に常駐することができる。データキューは、データパケット又はディスクリプタを含むことができるデータを保持するように構成されたリングバッファ又は他の適切なデータ構造とすることができ、このデータパケット又はディスクリプタは、データパケットへのポインタを、データパケットに関連付けられた他の情報とともに含む。制御回路２０２とデータキュー２０４との各組は、ホストシステム１０６上の、１又は複数の対応するプロセッサ１０８、１１０に関連付けられることができる。
【００１４】
各プロセッサ１０８は、デバイスドライバモジュール１１２をホストすることができ、デバイスドライバモジュール１１２はさらに、割り込みハンドラ２０６、割り込み又はタイマ駆動スタック処理モジュール２０８及び待ち時間低減ビジーポーリングモジュール２１８を含むことができる。プロセッサ１０８はさらに、ドライバモジュール１１２、システムコールモジュール２１４及びユーザコンテキストアプリケーション処理モジュール２１６の間のインタフェースをとるように構成されたネットワークスタックモジュール２１２を含むことができる。ネットワークスタックモジュール２１２は、例えば、トランスミッションコントロールプロトコル（ＴＣＰ）又はユーザデータグラムプロトコル（ＵＤＰ）などのネットワーキングプロトコルを実装するように構成されることができる。システムコールモジュール２１４は、ネットワークスタック及びユーザコンテキストアプリケーション処理モジュール２１６と関連して、ユーザ要求をサービスし、かつイベントに関してソケットを監視するように構成されることができ、その動作は、以下でより詳細に説明される。いくつかの実施形態において、割り込み／タイマ駆動スタック処理モジュール２０８は、Ｌｉｎｕｘ（登録商標）ＯＳの実装と関連して、ＮＡＰＩ（ＮｅｗＡＰＩの頭字語）と呼ばれることがあるセミポーリング（semi-polling）ステートマシンを採用することができる。ＮＰＡＩベースのシステムは、システム負荷に依存して、割り込み駆動処理とタイマ駆動処理との間で動的に切り替えるように構成されることができる。
【００１５】
システムコールモジュール２１４は、ユーザコンテキストアプリケーション２１６が、アプリケーションにとって関心のあるソケット上にアクティビティ（例えば、ネットワークイベント）が存在するときに通知されることができるように、メカニズムを提供する。ネットワークイベントは、ネットワークスタックモジュール２１２によって提供されることができ、ソケットの識別子とソケットへのパケットのパス（例えば、モジュール２０８又はモジュール２１８）に関する情報とを含むことができる。
【００１６】
下記の議論を目的として、ｅｐｏｌｌというＬｉｎｕｘ（登録商標）ＯＳシステムコールが、本開示と調和する種々の実施形態を説明するために使用されることになるが、本開示は、この特定のシステムコール実装又はオペレーティングシステムに限定されない。
【００１７】
ユーザアプリケーションとｅｐｏｌｌシステムコールとの間のインタフェースは、監視すべき個々のファイルディスクリプタをユーザアプリケーションが追加及び削除することができる仮想ファイルを提供する。これらのファイルは、例えば、関心のあるソケットとすることができる。ユーザにとって関心のある個々のソケットのアイデンティティ及び数は時間とともに変わる可能性があるが、ｅｐｏｌｌ仮想ファイルは、通常、監視されているいくらかの数のファイルディスクリプタ／ソケットを参照する持続性のコンテキストとなる。この持続性のコンテキストは、以下に説明されるとおり、より精巧なデータ構造及びより効率的な処理の使用を可能にする。
【００１８】
待ち時間低減ビジーポーリングモジュール２１８は、サポートされるデバイスからパケットを受信する各ソケットについて、ソケットが最も直近にパケットを受信したところであるデバイスキューを監視するように構成されることができる。この情報は、ユーザアプリケーションからの読み出し又はポーリング要求がレポートするものを何も有しないとき、上記キュー上でビジーポーリングをアクティブ化するために使用される。ビジーポーリングがアクティブ化されているキューは、例えばラウンドロビン方式で、システムコールモジュール２１４によって、新しいパケット、イベント又は他のデータが利用できることに関して繰り返しチェックされる。
【００１９】
図３（ａ）は、本開示と調和する別の例示的実施形態のブロック図３００ａを示す。システムコールモジュール２１４は、例えば、上記で説明されたｅｐｏｌｌなどのメカニズムを通じて、ネットワークイベントを扱い、かつネットワークスタック内のパケット処理と対話するように構成されることができる。システムコールモジュール２１４は、各ｅｐｏｌｌコンテキストについてのハッシュテーブル３０６を採用する処理オプション１  ３０２を用いて実装されることができる。ハッシュテーブルの各エントリは、（デバイスキューが監視されているソケットを有する場合、）デバイスキュー２０４のうち１つに関連付けられ、固有ソケット３０８及び衝突リスト３１０にリンクされる。この動作は、以下で、図４に示されるフローチャートに関連して説明される。
【００２０】
図３（ｂ）は、本開示と調和する別の例示的実施形態のブロック図３００ｂを示す。システムコールモジュール２１４は、各デバイスキュー２０４を固有ソケット識別子３０８にリンクする固有リスト３１２を採用する処理オプション２  ３０４を用いて実装されることができる。この動作は、以下で、図５に示されるフローチャートと関連して説明される。
【００２１】
いくつかの実施形態において、ハッシュテーブル又はリストに代わって、他の種類のデータ構造が使用されることができることを十分理解されたい。任意の適切なデータ構造を使用することができ、すなわち、例えば、２段階のハッシュテーブルが使用されることができ、あるいは一実装がハッシュテーブルに代わってリストを使用することができる。
【００２２】
図４は、本開示と調和する１つの例示的実施形態の動作４００のフローチャートを示す。３００ａの処理オプション１  ３０２が、例えばｅｐｏｌｌによって、ネットワークイベントの到着に応答して実行される動作４００のフローチャートとして、示されている。この実施形態は、各ｅｐｏｌｌインスタンスに関連付けられたソケットを識別し、ハッシュテーブル３０６を維持するものであり、ハッシュテーブル３０６は、監視されているソケットのうち１又は複数に供給をする各デバイスキューについてのエントリを有する。これらのエントリは、デバイスキューを、固有ソケット３０８及び衝突リスト３１０にマップする。このリストは、例えば、リンクリストとして実装されることができ、このリストは、本実施形態の場合のように、リスト内のエントリのロケーションが既知であるとき、エントリを追加及び削除することに関して効率の増大を提供する。新しいソケットがｅｐｏｌｌを通じて登録されるとき、このソケットに関連付けられたデバイスキューが識別される。上記キューに関して、ハッシュエントリがまだ存在していない場合、ハッシュエントリが作成され、テーブルに追加され、ソケットがハッシュエントリにリンクされる。このソケットは、上記キューに対する「固有」ソケット３０８になる。別法として、上記キューに対するハッシュエントリがすでに存在した場合、このソケットは、上記キューに関連付けられているソケットの衝突リスト３１０に追加される。
【００２３】
ソケットが削除されるとき、ｅｐｏｌｌコンテキストから、このソケットが上記デバイスキューに関して衝突リスト上に存在したかどうか、あるいはこのソケットが上記キューに対する固有ソケットであったかどうかを判定するように、チェックが実行される。ソケットが衝突リスト上に存在する場合、このソケットはリストから削除される。ソケットが上記キューに対する固有ソケットであり、かつ上記キューに関して衝突リスト上に他のソケットが存在しない場合、上記キューについてのハッシュテーブル内のエントリは抹消される。しかしながら、衝突リスト上に他のソケットが存在した場合、これらソケットのうち１つが、衝突リストから削除され、さらにハッシュテーブルにリンクされて、上記キューに対する新しい固有ソケットになる。
【００２４】
待ち時間低減ビジーポーリングモジュール２１８及び／又はシステムコールモジュール２１４は、ハッシュテーブル３０６にリストアップされているデバイスキューへのポーリングを制限することができる。
【００２５】
ソケットに関連付けられたデバイスキューが変わる場合、このソケットは、上記で説明されたとおり、最初に削除され、次いで、新しいキューを用いて再登録されることができる。
【００２６】
動作４０２において、パケットがデバイスキューからソケット上に到着する。動作４０４において、デバイスキューアイデンティティ（ＩＤ）が有効であることが検証される。このことは、いくつかのデバイスが本開示に説明される実施形態の特徴をサポートしないように構成される可能性があるため、あるいはデバイスに関して、オプションが単に無効にされている（例えば、システム管理者によってオフにされている）可能性があるため、行われる。動作４０６において、上記キューに関して衝突リスト上にこのソケットが存在するかどうかを判定するように、チェックが実行される。存在しない場合、次いで、動作４０８、４１０において、上記キューに対するハッシュテーブルエントリが検索され、このソケットが固有ソケットとしてキューにリンクされていない場合、動作４１２において、このソケットは衝突リストに追加される。上記キューに対するハッシュテーブルエントリが存在しない場合、動作４１４において、新しいエントリが追加され、ソケットは固有ソケットとしてこの新しいエントリにリンクされる。
【００２７】
ソケットのキューとの関連付けは、例えば、パケットが（例えば、ルーティングの変更に起因して、）別のネットワークデバイスから来たとき、あるいはキュー割り当てがネットワークデバイス上で変わったとき、動的に変わることができる。動作４１６において判定されるとおり、ソケットに関連付けられたデバイスキューが変わった場合、動作４１８から４２８において、ソケットは、上記デバイスキューハッシュテーブルエントリ又は関連する衝突リストから削除され、次いで、新しいキューＩＤを用いて再登録され、動作４１０から始まることになる。
【００２８】
図５は、本開示と調和する別の例示的実施形態の動作５００のフローチャートを示す。３００ｂの処理オプション２  ３０４が、例えばｅｐｏｌｌによって、ネットワークイベントの到着に応答して実行される動作５００のフローチャートとして、示されている。この実施形態において、固有ソケットだけが、固有リスト３１２上で識別され、追跡され、このことが、アクティブなデバイスキューとこれらキューに関連付けられたソケットとの間の固有のマッピングを作成する。換言すると、固有リスト３１２は、ｅｐｏｌｌコンテキストによって監視されるソケットに対する固有キューをリストアップし、この固有キューを、キューによって支援（供給）をされる単一のソケットにリンクする。多数のソケットが存在することができ、これらソケットに関して、ネットワークスタックは任意のデバイスキューから到着するパケット又はイベントを予期するが、各キューに対して検索された最初のソケットだけが、すなわち固有ソケットが、追跡される。この実施形態において、衝突リストを維持する必要性は回避される。固有リスト３１２は、エントリの追加及び抹消を容易にするためにリンクリストとして実装されることができる。
【００２９】
パケットがソケットに到着すると、このパケットが、割り込み／タイマ駆動スタック処理モジュール２０８（例えば、第１のパス）を通じて来たのか、あるいは待ち時間低減ビジーポーリングモジュール２１８（例えば、第２のパス）を通じて来たのかに関して、判定が行われる。パケットが割り込み／タイマ駆動スタック処理モジュール２０８（例えば、第１のパス）を通じて来た場合、そのキューが固有リスト３１２上に存在するかどうかを判定するようにチェックが行われ、存在しない場合、キュー及びソケットが追加される。このチェックは、多数のパケットがチェックされる必要がある可能性があるため、計算上、比較的高価なテストとなり得る。第２のパスである待ち時間低減ビジーポーリングモジュール２１８を通じて到着するパケットは、ポーリングされている（ビジーポーリングがアクティブ化されている）キューから来ていることが既知であり、したがって、テストされる必要がない。さらに、ビジーポーリングがアクティブであるとき、ほとんどのパケット（通常、９９．９％を超えるパケット）が、待ち時間低減ビジーポーリングモジュール２１８を通じて到着することになり、効率の増大をもたらすことになる。割り込み／タイマ駆動スタック処理モジュール２０８を通じて来るパケットは比較的少なくなるため、ビジーポーリングがアクティブであるとき、高価なソケットテスト（固有リストを検索すること）は、パケットが２連続で割り込みパス（第１のパス）を通じて来るまで、先送りされる可能性がある。これにより、誤検出テストの発生率を、名目上の０．１％から名目上の０．０００１％の割合に至るまで低減することができる。
【００３０】
あるソケットに関連付けられているデバイスキューが変わり、このソケットが固有リスト上に存在した場合、このソケットはリストから削除されることができる。上記デバイスキューを使用する他のソケットが存在する場合、それらソケットのうち１つがこのソケットに対する処理の結果として後に追加されることになり、上記処理は、このソケットが待ち時間低減パスを通じてサービスされていなかった（例えば、２連続で割り込みパスを通じて提供されていた）ことを検出することになる。
【００３１】
待ち時間低減ビジーポーリングモジュール２１８及び／又はシステムコールモジュール２１４は、固有リスト３１２内にリストアップされているデバイスキューへのポーリングを制限することができる。
【００３２】
動作５０２において、パケットがデバイスキューからソケットに到着する。動作５０４、５０６において、ソケットに関連付けられたデバイスキューが変わった（例えば、デバイスキューＩＤが変わった）場合で、さらに、ソケットが固有リスト３１２上に存在した場合、動作５０８において、古いデバイスキューＩＤと関連するソケットとがリストから削除され、手順が動作５１０に続く。そうではない場合、動作５１６において、パケットが割り込み／タイマ駆動スタック処理モジュール２０８を通じて到着しなかった場合、手順は完了し、パケットは、待ち時間低減ビジーポーリングモジュール２１８によって正しく扱われることになる。
【００３３】
しかしながら、パケットが割り込み／タイマ駆動スタック処理モジュール２０８を通じて到着した場合、動作５１０、５１２において、デバイスキューＩＤが有効であり、しかしリスト上に存在しない場合、動作５１４において、デバイスキュー及びソケットがリストに追加されることになり、手順が完了する。
【００３４】
フローチャート上の太線部、例えば５２０は、ほとんどのパケット、例えば９０％を超えるパケットに関して通常実行されることになるパスを示す。
【００３５】
いくつかの実施形態において、ハードウェアサポートが提供されて、より高い効率においてデバイスキューをポーリングすることができる。各ｅｐｏｌｌインスタンスは、上記ｅｐｏｌｌインスタンスによって現在使用中であるハードウェアデータキューにリンクされたハードウェアイベントキューに関連付けられることができる。これらのハードウェアデータキューは、ｅｐｏｌｌが、これらキュー上に、自身が監視しているソケット、例えば固有リスト上のソケットに関して到着するネットワークデータ及びイベントを予期するものである。ハードウェアイベントキューは、関連するハードウェアデータキューのいずれかが利用可能なイベントを有するときに生成される通知を受信するように構成されることができる。ハードウェアデータキューは、上記ｅｐｏｌｌが関心のあるソケットを追加及び削除するとき、ｅｐｏｌｌインスタンスについてのイベントキューから追加又は削除されることができる。監視すべきデータキューのリストは、例えば、図３（ａ）及び図３（ｂ）と関連して説明されたとおりに、維持されることができる。
【００３６】
別法として、いくつかの実施形態において、ハードウェアサポートは、デバイスによって更新されることができるステータスレジスタ（又は、他のデータ構造）を通じて提供されることができる。このレジスタの内容は、ＣＰＵ／ＯＳが監視するのに便利であるホストメモリロケーションに複製されることができる。レジスタは、所与のｅｐｏｌｌインスタンス（又は、プロセッサ）に関連付けられているハードウェアデバイスキューの各々についてのステータスビットを含むことができる。キューについてのステータスビットは、キュー上にアクティビティ（例えば、イベント）が存在するときに設定されることができる。このビットは、タイムアウトの満了後、あるいはドライバがイベントを認識した後、レジスタに書き込むことによって直接的にか、あるいは入ってくるパケットの処理を通じてキュー状態を更新することによって間接的にかのいずれかで、自動的にクリアされることができる。別法として、ステータスビットは、イベントに応答して、（オンからオフへ、及びオフからオンへ）切り替えられることができる。この実施形態において、１つのロケーションだけがポーリングされ、レジスタ（又は、その値のホストメモリコピー）はソケットのすべてを効率的に表し、このことが効率を増大させる。ここで再びになるが、監視すべきデータキューのリストは、例えば、図３（ａ）及び図３（ｂ）に関連して説明されるとおりに、維持されることができる。
【００３７】
いくつかの実施形態において、システムコールモジュール２１４は、プロセッサ上で、ｍｏｎｉｔｏｒ及びｍｗａｉｔ命令（ｏｐコード）を実行することができる。ｍｏｎｉｔｏｒ及びｍｗａｉｔ命令は、プロセッサをアイドル又はスリープモードにするように構成されることができ、このモードは、上記で言及されたステータスデータ構造を含むＣＰＵキャッシュラインが書き込みされるときに起動するようにトリガされる。これは、デバイスキューのビジーポーリングに代わって、より電力効率が良くすることができる。いくつかの実施形態において、ｍｗａｉｔ命令は、指定時刻に動作するｍｗａｉｔ命令とすることができる。指定時刻に動作するｍｗａｉｔ命令は、例えば、時間閾値が満了した後に起動をトリガするように、時限メカニズムと共に構成されることができる。ｍｗａｉｔ命令を使用してデバイスキューの各々を待つことができるが、上記で説明されたような、ステータスレジスタが提供される実施形態において、ｍｗａｉｔ命令を使用して単にステータスレジスタを待つことができる。
【００３８】
図６は、本開示と調和する別の例示的実施形態の動作６００のフローチャートを示す。この動作は、パケット処理待ち時間の低減に関して、ソケットと関連するデバイスキューとの管理のための方法を提供する。動作６１０において、固有リストが維持される。固有リストは、デバイスキューとデバイスキューの各々についての関連する固有ソケットとを識別するエントリを含み、固有ソケットは、パケットを受信するように構成された複数のソケットから選択される。動作６２０において、固有リスト上のデバイスキューは、ビジーポーリングされる。動作６３０において、パケットが、複数のソケットのうち１つから受信される。動作６４０において、固有リストは、受信されたパケットが割り込み処理モジュールによって提供されたと検出したことに応答して更新される。動作６５０において、上記の更新は、受信されたパケットに関連付けられたデバイスキューを識別することと、受信されたパケットに関連付けられたソケットを識別することと、識別されたデバイスキューが固有リスト上のエントリのうちの１つにない場合に、固有リスト上に新しいエントリを作成することとを含み、この新しいエントリは、識別されたデバイスキューと識別されたソケットとを含む。
【００３９】
１つの例示的な、ソースコードソフトウェアの実施形態を、付録Ａにおいて提示する。
【００４０】
本明細書に説明される方法の実施形態は、１又は複数のプロセッサによって実行されると本方法を実行する命令を個々に、又は組み合わせで記憶した１又は複数の記憶媒体を含むシステムにおいて実施されることができる。ここで、プロセッサには、例えば、システムＣＰＵ（例えば、コアプロセッサ）及び／又はプログラマブル回路を含むことができる。したがって、本明細書に説明される方法による動作は、複数の種々の物理的ロケーションにおける処理構造などの、複数の物理的デバイスにわたって分散されてよいことが意図される。また、本方法動作は、当業者が理解するであろうとおり、個々に、又はサブコンビネーションで実行されてよいことが意図される。したがって、フローチャートの各々の動作のすべてが実行される必要があるものではなく、本開示は、当業者が理解するであろうとおり、こうした動作のすべてのサブコンビネーションが有効にされることを明示的に意図する。
【００４１】
記憶媒体には、任意の種類の有形媒体、例えば、フロッピー（登録商標）ディスク、光ディスク、コンパクトディスク読取専用メモリ（ＣＤ−ＲＯＭ）、書換可能コンパクトディスク（ＣＤ−ＲＷ）、デジタル多用途ディスク（ＤＶＤ）及び光磁気ディスクを含む任意の種類のディスク、読取専用メモリ（ＲＯＭ）などの半導体デバイス、ダイナミックＲＡＭ及びスタティックＲＡＭなどのランダムアクセスメモリ（ＲＡＭ）、消去可能プログラマブル読取専用メモリ（ＥＰＲＯＭ）、電気的消去可能プログラマブル読取専用メモリ（ＥＥＰＲＯＭ）、フラッシュメモリ、磁気若しくは光学カード、又は電子的命令を記憶することに適した任意の種類のメディアを含むことができる。
【００４２】
本明細書の任意の実施形態において使用される「回路」には、例えば、ハードワイヤード回路、プログラマブル回路、ステートマシン回路、及び／又はプログラマブル回路によって実行される命令を記憶するファームウェアを、単独で、又は任意の組み合わせで含むことができる。いくつかの実施形態において、回路は、ソフトウェア又は任意の適切なプログラマブル動作セットとして実装されることができる。アプリは、ホストプロセッサ又は他のプログラマブル回路などのプログラマブル回路上で実行されることができるコード又は命令として具現化されることができる。本明細書の任意の実施形態において使用されるモジュールは、回路、ファームウェア、ソフトウェア、又はこれらの任意の組み合わせとして具体化されることができる。回路は、集積回路チップなどの集積回路として具現化されることができる。
【００４３】
したがって、本開示は、待ち時間低減パケット処理に関して、ソケットと関連するデバイスキューとの管理のためのシステム、方法、コンピュータ読取可能媒体を提供する。下記の例は、さらなる実施形態に関連する。
【００４４】
本システムには、固有リストを維持するように構成されたシステムコールモジュールを含むことができ、固有リストには、デバイスキューとデバイスキューの各々についての関連する固有ソケットとを識別するエントリを含むことができ、固有ソケットは、パケットを受信するように構成された複数のソケットから選択されることができる。本例のシステムは、さらに、固有リスト上のデバイスキューをビジーポーリングするように構成された待ち時間低減ビジーポーリングモジュールを含むことができる。本例のシステムは、さらに、複数のソケットのうち１つからパケットを受信するように構成されたネットワークスタックモジュールを含むことができる。本例のシステムコールモジュールは、さらに、受信されたパケットが割り込み処理モジュールによって提供されたと検出したことに応答して、固有リストを更新するように構成されることができ、上記の更新には、受信されたパケットに関連付けられたデバイスキューを識別することと、受信されたパケットに関連付けられたソケットを識別することと、識別されたデバイスキューが固有リスト上のエントリのうちの１つにない場合に、固有リスト上に新しいエントリを作成することとを含むことができ、この新しいエントリは、識別されたデバイスキューと識別されたソケットとを含むことができる。
【００４５】
別の例示的デバイスは、前述のコンポーネントを含み、システムコールモジュールはさらに、割り込み処理モジュールによって提供される２番目の連続して受信されるパケットの検出まで固有リストの更新を遅延させるように構成される。
【００４６】
別の例示的デバイスは、前述のコンポーネントを含み、システムコールモジュールはさらに、ソケットとデバイスキューとの間の関連付けにおける変更を検出し、変更されたソケットが固有リスト上のエントリのうちの１つにあるかどうかを判定し、判定に応答して、固有リストから、変更されたソケットを含むエントリを削除するように構成される。
【００４７】
別の例示的デバイスは、前述のコンポーネントを含み、割り込み処理モジュールは、タイマ駆動である。
【００４８】
別の例示的デバイスは、前述のコンポーネントを含み、固有リスト上のデバイスキュー内のイベントが利用できることに応答して通知を生成するように構成されたハードウェアイベントキューをさらに含み、ビジーポーリングは、この通知を受信することを含む。
【００４９】
別の例示的デバイスは、前述のコンポーネントを含み、ビジーポーリングは、ハードウェアイベントキューを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行することを含み、ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、プロセッサをスリープ状態に移行するように構成され、スリープ状態は、ハードウェアイベントキューの変化に応答して終了する。
【００５０】
別の例示的デバイスは、前述のコンポーネントを含み、ステータスビットを含むステータスレジスタをさらに含み、ステータスビットの各々は、固有リスト上のデバイスキューに関連付けられ、ステータスビットは、固有リスト上のデバイスキュー内のイベントが利用可能であることを示すように設定され、ビジーポーリングは、ステータスレジスタを監視することを含む。
【００５１】
別の例示的デバイスは、前述のコンポーネントを含み、ビジーポーリングは、ステータスレジスタを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行することを含み、ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、プロセッサをスリープ状態に移行するように構成され、スリープ状態は、ステータスビットの変化に応答して終了する。
【００５２】
別の態様に従い、方法が提供される。この方法は、固有リストを維持することを含むことができ、固有リストは、デバイスキューとデバイスキューの各々についての関連する固有ソケットとを識別するエントリを含むことができ、固有ソケットは、パケットを受信するように構成された複数のソケットから選択されることができる。本例の方法は、さらに、固有リスト上のデバイスキューをビジーポーリングすることを含むことができる。本例の方法は、さらに、複数のソケットのうち１つからパケットを受信することを含むことができる。本例の方法は、さらに、受信されたパケットが割り込み処理モジュールによって提供されたと検出したことに応答して、固有リストを更新することを含むことができ、この更新には、受信されたパケットに関連付けられたデバイスキューを識別することと、受信されたパケットに関連付けられたソケットを識別することと、識別されたデバイスキューが固有リスト上のエントリのうちの１つにない場合に、固有リスト上に新しいエントリを作成することと、を含むことができ、この新しいエントリは、識別されたデバイスキューと識別されたソケットとを含むことができる。
【００５３】
別の例示的方法は、前述の動作を含み、さらに、割り込み処理モジュールによって提供される２番目の連続して受信されるパケットの検出まで固有リストの更新を遅延させることを含む。
【００５４】
別の例示的方法は、前述の動作を含み、さらに、ソケットとデバイスキューとの間の関連付けにおける変更を検出することと、変更されたソケットが固有リスト上のエントリのうちの１つにあるかどうかを判定することと、この判定に応答して、固有リストから、変更されたソケットを含むエントリを削除することと、を含む。
【００５５】
別の例示的方法は、前述の動作を含み、ビジーポーリングは、固有リスト上のデバイスキュー内のイベントが利用可能であることに応答して通知を生成するように構成されたハードウェアイベントキューから通知を受信することをさらに含む。
【００５６】
別の例示的方法は、前述の動作を含み、さらに、ハードウェアイベントキューを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行することを含み、ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、プロセッサをスリープ状態に移行するように構成され、スリープ状態は、ハードウェアイベントキューの変化に応答して終了する。
【００５７】
別の例示的方法は、前述の動作を含み、ビジーポーリングは、ステータスレジスタを監視することをさらに含み、ステータスレジスタは、ステータスビットを含み、ステータスビットの各々は、固有リスト上のデバイスキューに関連付けられ、ステータスビットは、固有リスト上のデバイスキュー内のイベントが利用可能であることを示すように設定される。
【００５８】
別の例示的方法は、前述の動作を含み、さらに、ステータスレジスタを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行することを含み、ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、プロセッサをスリープ状態に移行するように構成され、スリープ状態は、ステータスビットの変化に応答して終了する。
【００５９】
別の態様に従い、方法が提供される。この方法は、デバイスキューを、固有ソケットに、及びさらなるソケットの衝突リストにマップするように構成されたハッシュテーブルを維持することを含み、固有ソケットとさらなるソケットとはデバイスキューに関連付けられる。本例の方法は、さらに、ハッシュテーブル上のデバイスキューをビジーポーリングすることを含むことができる。本例の方法は、さらに、ポーリングシステムコールから新しいソケット登録を受信することを含むことができる。本例の方法は、さらに、新しいソケットに関連付けられたデバイスキューを識別することを含むことができる。本例の方法は、さらに、識別されたデバイスキューがハッシュテーブル内にない場合に、識別されたデバイスキューについて、ハッシュテーブル内に新しいエントリを作成することを含むことができ、この新しいエントリは、新しいソケットを固有ソケットとして含み、空の衝突リストをさらに含む。本例の方法は、さらに、識別されたデバイスキューがハッシュテーブル内にある場合に、新しいソケットを、ハッシュテーブル内のデバイスキューエントリについて、衝突リストに追加することを含むことができる。
【００６０】
別の例示的方法は、前述の動作を含み、さらに、ソケットとデバイスキューとの間の関連付けにおける変更を検出することと、変更されたソケットがデバイスキューに関連付けられた衝突リスト上にある場合に、変更されたソケットを衝突リストから削除することと、変更されたソケットがデバイスキューに関連付けられた固有ソケットであり、デバイスキューに関連付けられた衝突リストが空である場合に、デバイスキューに関して、ハッシュテーブル内のエントリを抹消することと、変更されたソケットがデバイスキューに関連付けられた固有ソケットであり、デバイスキューに関連付けられた衝突リストが空でない場合に、デバイスキューに関連付けられた固有ソケットを、衝突リスト上のソケットのうちの１つで置換することと、を含む。
【００６１】
別の例示的方法は、前述の動作を含み、ビジーポーリングは、固有リスト上のデバイスキュー内のイベントが利用可能であることに応答して通知を生成するように構成されたハードウェアイベントキューから通知を受信することをさらに含む。
【００６２】
別の例示的方法は、前述の動作を含み、さらに、ハードウェアイベントキューを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行することを含み、ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、プロセッサをスリープ状態に移行するように構成され、スリープ状態は、ハードウェアイベントキューの変化に応答して終了する。
【００６３】
別の例示的方法は、前述の動作を含み、ビジーポーリングは、ステータスレジスタを監視することをさらに含み、ステータスレジスタは、ステータスビットを含み、ステータスビットの各々は、固有リスト上のデバイスキューに関連付けられ、ステータスビットは、固有リスト上のデバイスキュー内のイベントが利用可能であることを示すように設定される。
【００６４】
別の例示的方法は、前述の動作を含み、さらに、ステータスレジスタを含むキャッシュラインに関連付けられたプロセッサ上でｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令を実行することを含み、ｍｏｎｉｔｏｒ命令及びｍｗａｉｔ命令は、プロセッサをスリープ状態に移行するように構成され、スリープ状態は、ステータスビットの変化に応答して終了する。
【００６５】
別の態様に従い、少なくとも１つのコンピュータ読取可能記憶媒体が提供され、このコンピュータ読取可能記憶媒体は、プロセッサにより実行されると、上記例のいずれかに説明されたとおりの方法の動作をプロセッサに実行させる命令を記憶する。
【００６６】
別の態様に従い、上記例のいずれかに説明されたとおりの方法を実行する手段を含む装置が提供される。
【００６７】
本明細書に採用されている用語及び表現は、限定の用語ではなく説明の用語として使用されており、こうした用語及び表現の使用において、図示及び説明されている特徴（又は、その部分）の何らかの均等物を除外する意図はまったくなく、種々の修正が請求項の範囲内で可能であることを認識されたい。したがって、請求項は、すべてのこうした均等物をカバーするものである。種々の特徴、態様及び実施形態が本明細書に説明されている。この特徴、態様及び実施形態は、当業者に理解されるであろうとおり、互いの組み合わせと、変形及び修正とを受け入れる余地がある。本開示は、したがって、こうした組み合わせ、変形及び修正を包含するとみなされるべきものである。
【００６８】
付録Ａ
diff  --git  a/fs/eventpoll.c  b/fs/eventpoll.c
index  9ad17b15..f432599  100644
---  a/fs/eventpoll.c
+++  b/fs/eventpoll.c
@@  -42,6  +42,7  @@
#include  <linux/proc_fs.h>
#include  <linux/seq_file.h>
#include  <linux/compat.h>
+#include  <net/busy_poll.h>
/*
*  LOCKING:
@@  -215,6  +216,9  @@  struct  eventpoll  {
/*  ループ検出チェックを最適化するために使用される  */
int  visited;
struct  list_head  visited_list_link;
+
+    /*  アクティブな固有のビジーポーリングidを有するビジーポーリングインデクスのリスト  */
+    struct  busy_list  busy_list;
};
/*  ポーリングフックで使用されるウェイト構造  */
@@  -233,6  +237,10  @@  struct  eppoll_entry  {
/*  “wait”ウェイトキューアイテムをリンクさせたウェイトキューヘッド  */
wait_queue_head_t  *whead;
+
+    /*  このファイルは自分たちのウェイターのビジーウェイトリスト内にあるか  */
+    struct  busy_state  busy;
+
};
/*  ポーリング待ち行列によって使用されるラッパー構造体  */
@@  -375,6  +383,103  @@  static  inline  int  ep_events_available(struct  eventpoll  *ep)
return  !list_empty(&ep->rdllist)  ||  ep->ovflist  !=  EP_UNACTIVE_PTR;
}
+#ifdef  CONFIG_NET_RX_BUSY_POLL
+/*
+  *  ビジーポーリングがオンであり、このpwqに対するファイルがソケットである場合、
+  *  socket構造体にポインタを返す
+  */
+static  inline  struct  socket  *ep_sock_from_pwq(struct  eppoll_entry  *pwq)
+{
+    struct  file  *file  =  pwq->base->ffd.file;
+    struct  inode  *inode  =  file_inode(file);
+
+    if  (!net_busy_loop_on())
+        return  NULL;
+
+    if  (!S_ISSOCK(inode->i_mode))
+        return  NULL;
+
+    return  file->private_data;
+}
+
+/*
+  *  ソケットがビジーポーリングリストに対して追加又は削除される必要があり得るかどうかをチェック
+  *  irqsが無効化され、ep->lockと共にコールされなければならない
+  */
+static  inline  void  eppoll_check_busy_poll(struct  eventpoll  *ep,
+                                    struct  eppoll_entry  *pwq)
+{
+    struct  socket  *sock  =  ep_sock_from_pwq(pwq);
+
+    if  (!sock)
+        return;
+
+    busy_poll_update_socket(sock,  &ep->busy_list,  &pwq->busy.listed);
+}
+
+/*
+  *  ソケットをリスト上に有する間にオフにされている可能性があるため、
+  *  !net_busy_loop_onであっても削除において抹消を試みる
+  */
+static  inline  void  eppoll_del_busy_poll(struct  eventpoll  *ep,
+                                  struct  eppoll_entry  *pwq)
+{
+    struct  socket  *sock  =  pwq->busy.listed  ?  ep_sock_from_pwq(pwq)  :  NULL;
+    unsigned  long  flags;
+
+    if  (sock)  {
+        spin_lock_irqsave(&ep->lock,  flags);
+        busy_poll_delete_socket(&ep->busy_list,  sock);
+        pwq->busy.listed  =  false;
+        spin_unlock_irqrestore(&ep->lock,  flags);
+    }
+}
+
+/*
+  *  ユーザに対して何もなく、ビジーポーリングがオンであるときに
+  *  ep_poll()からコールされる
+  */
+static  inline  void  epoll_busy_loop(struct  eventpoll  *ep,  unsigned  long  end)
+{
+    struct  busy_poll_id_index  *idx;
+
+    rcu_read_lock_bh();
+
+    while  (!busy_loop_timeout(end)  &&  !need_resched())  {
+        list_for_each_entry_rcu(idx,  &ep->busy_list.head,  list)  {
+            if  (napi_id_busy_loop(idx->napi_id)  &&
+                ep_events_available(ep))
+                    goto  out;
+        }
+    }
+out:
+    rcu_read_unlock_bh();
+}
+
+#else  /*  CONFIG_NET_RX_BUSY_POLL  */
+
+static  inline  struct  socket  *ep_sock_from_pwq(struct  eppoll_entry  *pwq)
+{
+    return  NULL;
+}
+
+static  inline  void  eppoll_check_busy_poll(struct  eventpoll  *ep,
+                                    struct  eppoll_entry  *pwq)
+{
+}
+
+static  inline  void  eppoll_del_busy_poll(struct  eventpoll  *ep,
+                                  struct  eppoll_entry  *pwq)
+{
+}
+
+static  inline  void  epoll_busy_loop(struct  eventpoll  *ep,  unsigned  long  end)
+{
+}
+#endif  /*  CONFIG_NET_RX_BUSY_POLL  */
+
+
+
/**
*  ep_call_nested  -  再帰制限を超過していないことと下記とをチェックすること
*    によって、バインドされた（可能性として）ネストされたコールを実行する
@@  -536,6  +641,7  @@  static  void  ep_unregister_pollwait(struct  eventpoll  *ep,  struct  epitem  *epi)
list_del(&pwq->llink);
ep_remove_wait_queue(pwq);
+        eppoll_del_busy_poll(ep,  pwq);
kmem_cache_free(pwq_cache,  pwq);
}
}
@@  -755,6  +861,10  @@  static  void  ep_free(struct  eventpoll  *ep)
epi  =  rb_entry(rbp,  struct  epitem,  rbn);
ep_remove(ep,  epi);
}
+
+    /*  この段階で  ep->ll_list  は空であるべきである  */
+    warn_busy_list_empty(&ep->busy_list);
+
mutex_unlock(&ep->mtx);
mutex_unlock(&epmutex);
@@  -920,6  +1030,7  @@  static  int  ep_alloc(struct  eventpoll  **pep)
init_waitqueue_head(&ep->wq);
init_waitqueue_head(&ep->poll_wait);
INIT_LIST_HEAD(&ep->rdllist);
+    init_busy_list(&ep->busy_list);
ep->rbr  =  RB_ROOT;
ep->ovflist  =  EP_UNACTIVE_PTR;
ep->user  =  user;
@@  -987,6  +1098,8  @@  static  int  ep_poll_callback(wait_queue_t  *wait,  unsigned  mode,  int  sync,  void  *k
spin_lock_irqsave(&ep->lock,  flags);
+    eppoll_check_busy_poll(ep,  ep_pwq_from_wait(wait));
+
/*
*  イベントマスクがpoll(2)イベントを含まない場合、ディスクリプタは
*  無効にされると考える。この状況は下記の影響である可能性が高い
@@  -1066,9  +1179,11  @@  static  void  ep_ptable_queue_proc(struct  file  *file,  wait_queue_head_t  *whead,
init_waitqueue_func_entry(&pwq->wait,  ep_poll_callback);
pwq->whead  =  whead;
pwq->base  =  epi;
+        init_busy_state(&pwq->busy);
add_wait_queue(whead,  &pwq->wait);
list_add_tail(&pwq->llink,  &epi->pwqlist);
epi->nwait++;
+        eppoll_check_busy_poll(epi->ep,  pwq);
}  else  {
/*  エラーが発生したことをシグナル送信しなければならない  */
epi->nwait  =  -1;
@@  -1559,6  +1674,7  @@  static  int  ep_poll(struct  eventpoll  *ep,  struct  epoll_event  __user  *events,
long  slack  =  0;
wait_queue_t  wait;
ktime_t  expires,  *to  =  NULL;
+    unsigned  long  busy_loop_end  =  0;
if  (timeout  >  0)  {
struct  timespec  end_time  =  ep_set_mstimeout(timeout);
@@  -1577,6  +1693,21  @@  static  int  ep_poll(struct  eventpoll  *ep,  struct  epoll_event  __user  *events,
}
fetch_events:
+
+    /*
+      *  グローバルにオンであり、ソケット発見かつイベントなしをサポートしている場合にビジーポーリングする
+      *  ビジーループはneed_resched又はep_events_availableの場合にリターンする
+      *
+      *  irqsが有効化された状態でビジーポーリングをしなければならない
+      */
+
+    if  (epoll_can_busy_loop(&ep->busy_list)  &&  !ep_events_available(ep))  {
+        if  (!busy_loop_end)
+            busy_loop_end  =  busy_loop_end_time();
+
+        epoll_busy_loop(ep,  busy_loop_end);
+    }
+
spin_lock_irqsave(&ep->lock,  flags);
if  (!ep_events_available(ep))  {
diff  --git  a/include/linux/poll.h  b/include/linux/poll.h
index  c08386f..8de6133  100644
---  a/include/linux/poll.h
+++  b/include/linux/poll.h
@@  -69,7  +69,7  @@  static  inline  unsigned  long  poll_requested_events(const  poll_table  *p)
static  inline  void  init_poll_funcptr(poll_table  *pt,  poll_queue_proc  qproc)
{
pt->_qproc  =  qproc;
-    pt->_key    =  ~0UL;  /*  すべてのイベントが有効化されている  */
+    pt->_key    =  ~(unsigned  long)  POLL_BUSY_LOOP;
}
struct  poll_table_entry  {
diff  --git  a/include/net/busy_poll.h  b/include/net/busy_poll.h
index  7a7abe9..4c25a1b  100644
---  a/include/net/busy_poll.h
+++  b/include/net/busy_poll.h
@@  -37,6  +37,13  @@  extern  unsigned  int  sysctl_net_busy_poll  __read_mostly;
#define  LL_FLUSH_FAILED        -1
#define  LL_FLUSH_BUSY          -2
+/*  sk_ll_state  値  */
+#define  SK_LL_STATE_NONE    0
+#define  SK_LL_STATE_EVICT    1
+#define  SK_LL_STATE_MISS    2
+#define  SK_LL_STATE_MISS_2    4
+#define  SK_LL_STATE_NEEDS_SERVICE  (SK_LL_STATE_MISS_2  |  SK_LL_STATE_EVICT)
+
static  inline  bool  net_busy_loop_on(void)
{
return  sysctl_net_busy_poll;
@@  -89,6  +96,24  @@  static  inline  bool  busy_loop_timeout(unsigned  long  end_time)
return  time_after(now,  end_time);
}
+/*  rcu_read_lock_bhと共にコールされなければならない
+  *  ops->ndo_ll_pollはnullであってはならない
+  */
+static  inline  bool  __napi_busy_loop(const  struct  net_device_ops  *ops,
+                            struct  napi_struct  *napi)
+{
+    int  rc  =  ops->ndo_busy_poll(napi);
+
+    if  (rc  >  0)  {
+        /*  ローカルbhが無効化されているので_BHを使用してＯＫ  */
+        NET_ADD_STATS_BH(dev_net(napi->dev),
+                    LINUX_MIB_BUSYPOLLRXPACKETS,  rc);
+        return  true;
+    }
+
+    return  false;
+}
+
/*  sock_poll()で使用されるとき、nonblockはコンパイル時にtrueであることが既知
*  なので、ループとend_timeは外へ最適化されることになる
*/
@@  -114,16  +139,11  @@  static  inline  bool  sk_busy_loop(struct  sock  *sk,  int  nonblock)
goto  out;
do  {
-        rc  =  ops->ndo_busy_poll(napi);
+        rc  =  __napi_busy_loop(ops,  napi);
if  (rc  ==  LL_FLUSH_FAILED)
break;  /*  固定障害  */
-        if  (rc  >  0)
-            /*  ローカルbhが無効化されているので_BHを使用してＯＫ  */
-            NET_ADD_STATS_BH(sock_net(sk),
-                        LINUX_MIB_BUSYPOLLRXPACKETS,  rc);
-
}  while  (!nonblock  &&  skb_queue_empty(&sk->sk_receive_queue)  &&
!need_resched()  &&  !busy_loop_timeout(end_time));
@@  -133,6  +153,18  @@  out:
return  rc;
}
+/*  rcu_read_lock_bhと共にコールされなければならない  */
+static  inline  bool  napi_id_busy_loop(unsigned  int  id)
+{
+    struct  napi_struct  *napi  =  napi_by_id(id);
+    const  struct  net_device_ops  *ops  =  napi->dev->netdev_ops;
+
+    if  (!napi  ||  !ops->ndo_busy_poll)
+        return  false;
+
+    return  __napi_busy_loop(ops,  napi);
+}
+
/*  NIC受信ハンドラ内で使用されてskbをマーク付けする  */
static  inline  void  skb_mark_napi_id(struct  sk_buff  *skb,
struct  napi_struct  *napi)
@@  -140,13  +172,157  @@  static  inline  void  skb_mark_napi_id(struct  sk_buff  *skb,
skb->napi_id  =  napi->napi_id;
}
-/*  プロトコルハンドラ内で使用されてnapi_idをソケットに伝搬する  */
+/*  プロトコルハンドラ内で使用されてnapi_idをソケットに伝搬する
+  *  idが変わった場合、又はnapiから来た場合、これをepollのために記録する
+  */
static  inline  void  sk_mark_napi_id(struct  sock  *sk,  struct  sk_buff  *skb)
{
-    sk->sk_napi_id  =  skb->napi_id;
+    if  (unlikely(sk->sk_napi_id  !=  skb->napi_id))  {
+
+        sk->sk_napi_id  =  skb->napi_id;
+        sk->sk_ll_state  |=  SK_LL_STATE_EVICT;
+
+        /*  ゼロは有効なidではない  */
+        if  (sk->sk_napi_id)
+            sk->sk_ll_state  |=  SK_LL_STATE_MISS_2;
+
+    /*  キューが更新を必要とする場合を緩く検出：
+      *  softirq又はirqコンテキスト内で、あるrowにおいて２回ここに来た場合にのみ、
+      *  何らかが更新を必要としているだろうと考える
+      *  クレジット：Eliel  Louzoun
+      */
+    }  else  if  (unlikely(sk->sk_napi_id  &&  (in_serving_softirq()  ||
+                                      in_irq())))  {
+        if  (sk->sk_ll_state  &  SK_LL_STATE_MISS)
+            sk->sk_ll_state  |=  SK_LL_STATE_MISS_2;
+        else
+            sk->sk_ll_state  |=  SK_LL_STATE_MISS;
+    }  else
+        sk->sk_ll_state  =  SK_LL_STATE_NONE;
+
+}
+
+/*  epollサポート  */
+
+/*  リストは通常０〜２個の要素を持つことになるので、
+  *  シンプルなリンクリストを超える何らか手の込んだことをしても意味がない
+*/
+
+/*  epollサポートに関して使用される  */
+struct  busy_poll_id_index  {
+    struct  list_head  list;
+    struct  rcu_head      free_rcu;
+    unsigned  int      napi_id;
+    struct  sock      *sk;
+};
+
+/*  eventpoll構造体内で使用される  */
+struct  busy_list  {
+    struct  list_head  head;
+};
+
+/*  eppoll_entry内で使用される  */
+struct  busy_state  {
+    bool  listed;
+};
+
+static  inline  void  init_busy_list(struct  busy_list  *list)
+{
+    INIT_LIST_HEAD(&list->head);
+}
+
+static  inline  void  warn_busy_list_empty(struct  busy_list  *list)
+{
+    WARN_ONCE(!list_empty(&list->head),
+            "ep  busy  poll  list  not  empty  on  free\n");
+}
+
+static  inline  void  init_busy_state(struct  busy_state  *state)
+{
+    state->listed  =  false;
+}
+
+static  inline  bool  epoll_can_busy_loop(struct  busy_list  *list)
+{
+    return  net_busy_loop_on()  &&  !list_empty(&list->head);
+}
+
+/*  保持されているリストを保護するロックと共にコールされなければならない
+  */
+static  inline  bool  busy_poll_insert_socket(struct  busy_list  *list,
+                                    struct  socket  *sock)
+{
+    struct  sock  *sk  =  sock->sk;
+    unsigned  int  id  =  sk->sk_napi_id;
+    struct  busy_poll_id_index  *idx;
+
+
+    /*  このidがリスト内にないことを確認する  */
+    list_for_each_entry(idx,  &list->head,  list)
+        if  (idx->napi_id  ==  id)
+            return  false;
+
+    idx  =  kmalloc(sizeof(struct  busy_poll_id_index),  GFP_ATOMIC);
+
+    if  (!idx)
+        return  false;
+
+    idx->napi_id  =  id;
+    idx->sk  =  sk;
+    list_add_tail(&idx->list,  &list->head);
+
+    return  true;
+}
+
+/*  保持されているリストを保護するロックと共にコールされなければならない  */
+static  inline  bool  busy_poll_delete_socket(struct  busy_list  *list,
+                                    struct  socket  *sock)
+{
+    struct  sock  *sk  =  sock->sk;
+    unsigned  int  id  =  sk->sk_napi_id;
+    struct  busy_poll_id_index  *idx;
+
+    list_for_each_entry(idx,  &list->head,  list)
+        if  (idx->sk  ==  sk)  {
+            list_del_rcu(&idx->list);
+            kfree_rcu(idx,  free_rcu);
+            return  true;
+        }
+
+    /*  ここには決して到達すべきではない  */
+    WARN_ONCE(true,  "busy_poll_delete_id  %x  not  on  list\n",  id);
+    return  false;
+}
+
+/*  保持されているリストを保護するロックと共にコールされなければならない  */
+static  inline  void  busy_poll_update_socket(struct  socket  *sock,
+                                    struct  busy_list  *list,
+                                    bool  *listed)
+{
+    struct  sock  *sk  =  sock->sk;
+    unsigned  int  state  =  sk->sk_ll_state;
+
+    /*  ほぼ常にfalseであるべきである  */
+    if  (unlikely((state  &  SK_LL_STATE_NEEDS_SERVICE)))  {
+
+        bool  is_listed  =  *listed;
+
+        if  (is_listed  &&  (state  &  SK_LL_STATE_EVICT))
+            is_listed  =  !busy_poll_delete_socket(list,  sock);
+
+        /*  リストアップされていない場合にのみリストアップする  */
+        if  ((!is_listed)  &&  (state  &  SK_LL_STATE_MISS_2))
+            is_listed  =  busy_poll_insert_socket(list,  sock);
+
+        /*  ステートをクリアする  */
+        sk->sk_ll_state  =  SK_LL_STATE_NONE;
+
+        *listed  =  is_listed;
+    }
}
#else  /*  CONFIG_NET_RX_BUSY_POLL  */
+
static  inline  unsigned  long  net_busy_loop_on(void)
{
return  0;
@@  -167,6  +343,11  @@  static  inline  bool  sk_busy_poll(struct  sock  *sk,  int  nonblock)
return  false;
}
+static  inline  bool  napi_id_busy_loop(unsigned  int  id)
+{
+    return  false;
+}
+
static  inline  void  skb_mark_napi_id(struct  sk_buff  *skb,
struct  napi_struct  *napi)
{
@@  -186,5  +367,28  @@  static  inline  bool  sk_busy_loop(struct  sock  *sk,  int  nonblock)
return  false;
}
+struct  busy_poll_id_index  {  };
+
+struct  busy_list  {  };
+
+struct  busy_state  {  };
+
+static  inline  void  init_busy_list(struct  busy_list  *list)
+{
+}
+
+static  inline  void  warn_busy_list_empty(struct  busy_list  *list)
+{
+}
+
+static  inline  void  init_busy_state(struct  busy_state  *state)
+{
+}
+
+static  inline  bool  epoll_can_busy_loop(struct  busy_list  *list)
+{
+    return  false;
+}
+
#endif  /*  CONFIG_NET_RX_BUSY_POLL  */
#endif  /*  _LINUX_NET_BUSY_POLL_H  */
diff  --git  a/include/net/sock.h  b/include/net/sock.h
index  e4bbcbf..4fe42fd  100644
---  a/include/net/sock.h
+++  b/include/net/sock.h
@@  -330,6  +330,7  @@  struct  sock  {
#ifdef  CONFIG_NET_RX_BUSY_POLL
unsigned  int        sk_napi_id;
unsigned  int        sk_ll_usec;
+    unsigned  int        sk_ll_state;
#endif
atomic_t        sk_drops;
int            sk_rcvbuf;
【符号の説明】
【００６９】
１０２  ネットワーク
１０４  ネットワークインタフェース
１０６  ホストシステム
１０８、１１０  プロセッサ
１１２  待ち時間低減ドライバモジュール
２０２  制御回路
２０４  キュー
２０６  割り込みハンドラ
２０８  割り込み／タイマ駆動スタック処理モジュール
２１２  ネットワークスタックモジュール
２１４  システムコールモジュール
２１６  ユーザコンテキストアプリ
２１８  待ち時間低減ビジーポーリングモジュール
３０２  処理オプション１
３０６  ハッシュテーブル
３０８  固有ソケット
３１０  衝突リスト
３０４  処理オプション２
３１２  固有リスト
【図１】
0005925846.tif 000002
【図２】
0005925846.tif 000003
【図３（ａ）】
0005925846.tif 000004
【図３（ｂ）】
0005925846.tif 000005
【図４】
0005925846.tif 000006
【図５】
0005925846.tif 000007
【図６】
0005925846.tif 000008