Linuxネットワーク・サブシステム・パケットのソフトパケットの割り込み受信処理により受信され処理されるとき。
私の他のブログの記事を受けて、特定のプロセスを参照してください
ここでは、受信ソフト割り込みで閉じるように取引を分析します
受信ソフト割り込み初期化メッセージ
静的INT __init net_dev_init(ボイド)
{
......
open_softirq(NET_RX_SOFTIRQ、 net_rx_action)。
......
}
メッセージはソフト割り込みハンドラのnet_rx_actionコメントを受けました:
静的な無効 net_rx_action(構造体softirq_action * H)
{
/ * * / poll_listリストのsoftnet_dataローカルCPUを作っ
LIST_HEADをストラクト*リスト=&__ get_cpu_var(softnet_data).poll_list;
/ *設定された割り込みハンドラの最大許容実行時間は2であります* jiffy単位/の
jiffy単位+ = 2の符号なしのロングTIME_LIMIT;
/ *割り込み受信処理を設定したパケットの数が最大の関数である* 300 /
; INT予算netdev_budget =
* CPUローカル割り込みオン/オフ時間を、次のリストが空であるか否かを判定する* /ハードプリエンプションを防ぐ
local_irq_disable();
pool_listリストにNAPIを処理/ *待ち処理ループ* /
しばらく(list_empty(一覧)!)
{
構造体* n型napi_struct。
ワークINT、重量;
/ *処理パケットは停止実行の最大許容時間を超える最大処理時間または時間の数超えた場合
softnet_breakにジャンプする* /
IF(そうもない(予算<= 0 || time_after(jiffy単位の、TIME_LIMIT) ))
{
GOTO softnet_break;
}
/ *ローカル割り込みイネーブル、上記リストは空決意は、次のコールNAPIの、完了され
たポーリング機能が開いてハードウェア割り込み* /場合に実行される
local_irq_enable();
/ *リストはsoftnet_data pool_listを取得します上のNAPI、
今でもハード割り込みソフト割り込みプリエンプションは、NAPIは、エンドpool_listにハングアップします
Pool_listソフト割り込みのみようにクリティカルセクションが存在しない場合は、* /ということ、pool_listの頭部から除去すること
; N- LIST_ENTRY =(リスト- >次に、構造体napi_struct、poll_list)
/ * weighe NAPIポーリング処理のレコードが最大のパケットを許可しました数* /
重量= N->重量、
記録パケットNAPI合計ワークプロセスの/ *数* /
作業= 0;
/ *取得した状態NAPIがスケジュールされている場合、それはNAPI機能のポーリング処理を実行します* /
IF(test_bit(NAPI_STATE_SCHED、N-&>州))
{
作業= N->ポール(N、重量);
}
WARN_ON_ONCE(作業>重量);
/ *パケットの数を差し引い予算プロセスとなっている* /
予算- =ワーク;
/ *無効ローカルCPUの割り込みは、以下がsoftnet_dataにリンクされて完成しNAPI実行されません
尾の動作を、面積割り込み重要なハードウェアがあります。そして、whileループのリストがいるかどうか判断
ハードプリエンプションを禁止すべき空です* /
local_irq_disable();
/ *だけ処理されるパケットのNAPIポーリングプロセスの数が許容最大数に等しい場合、
処理すべきいかなるポーリングメッセージ処理部を説明していない完全* /
IF(そうもない(ワーク==重量))
{
/ * NAPIはpool_list softnet_data * /入れ、無効にされNAPIから取り出した場合
IF(そうもない(napi_disable_pending(N))を)
{
local_irq_enable();
napi_complete(N-);
local_irq_disable();
}
他
{
/ *さもなければ、pool_list NAPIの後端が* /移動
list_move_tail(N-&> poll_list、一覧);
}
}
}
アウト:
local_irq_enable();
リターン;
/ *処理時間が満了した場合、または処理されたパケットの数処理の最大数に
指示だけでなく、パケットがNAPI、スケジューリングソフトウェア割り込みを持っている必要がありますよう。
それ以外の場合は、ソフト割り込みパケット処理を指示することは、完全なNAPI、することはもはや必要性の一部に処理する必要が
* /ソフトウェア割り込みをスケジュール
softnet_break:
__get_cpu_var(netdev_rx_stat).time_squeeze ++;
__raise_softirq_irqoff(NET_RX_SOFTIRQ);
GOTO OUT;
}