通常、sk_buffは送信側で私が開発したモジュール(ネットワークドライバとのインターフェイス)によって "alloc_skb
"によって割り当てられ、ネットワークドライバに与えられます。基本的には、送信後にネットワークドライバによってフリーズされます。SKB割り当ての検出と確保フリー
私の開発したモジュールからSKBを解放する方法はありますか?またはネットワークドライバがskb buffを適切に解放しているかどうかを確認する方法はありますか?
通常、sk_buffは送信側で私が開発したモジュール(ネットワークドライバとのインターフェイス)によって "alloc_skb
"によって割り当てられ、ネットワークドライバに与えられます。基本的には、送信後にネットワークドライバによってフリーズされます。SKB割り当ての検出と確保フリー
私の開発したモジュールからSKBを解放する方法はありますか?またはネットワークドライバがskb buffを適切に解放しているかどうかを確認する方法はありますか?
私が正しく思い出した場合は、 "送信側"のバッファーのskb_get()
〜increment reference counterを使用することができます。これは、ネットワークドライバが回線に接続した後にバッファを解放するとすぐに、参照カウンタを減少させる適切な機能を呼び出しますが、以前の+ 1
のためにゼロ以外の値を維持するため、解放されません。その後、いつでもバッファを保持して(最後のユーザーのように)バッファを解放することができます。
あなたはチェーンsk_buff
の-sを持っている場合は、私はあなたが、各セグメントにskb_get()
を実行する必要が怖いです。
ネットワークドライバー自体がバッファーを正しく解放するようにするために、ネットワークドライバーで、送信および挿入デバッグ出力時にバッファーが解放される場所を見つけることができます。次に、再コンパイルして、通常の方法でドライバとやり取りしてください(つまり、ドライバにバッファを渡す前にskb_get()
を実行しないでください)。dmesg
に表示されるデバッグの出力を観察します。
ありがとうございます。私はsk-buff-sのチェーンを持っているので、ネットワークドライバでデバッグしようとします。 –
「送信側」とはどういう意味ですか?後で "ネットワークドライバ"と区別するため、最後に "my send side driver"という言葉を使用します。だから、 "送信側"が何であるか、あなたが話しているネットワークドライバ(カーネルで動作している)は何かを明確にしてください。 あなたが探しているのは 'sk_buff'リファレンスカウンタです。 'sk_buff'の' users'フィールドをインクリメントして、バッファを解放するのが安全でないことを示すことができます。フィールドはhttp://elixir.free-electrons.com/linux/latest/source/include/linux/skbuff.h#L764です。 –
質問が正しく更新されました –