2017-10-10 150 views
0

通常,sk_buff是由我在發送端通過「alloc_skb」開發併發送給網絡驅動程序的模塊(網絡驅動程序的接口)分配的。它在發送後基本上由網絡驅動程序釋放。檢測/確保SKB分配和釋放

有沒有辦法讓我的開發模塊免費SKB或有沒有辦法確保網絡驅動程序是否正確釋放skb buff?

+0

你說「發送方」是什麼意思?因爲稍後您將其與「網絡驅動程序」區分開來,最後您還會使用「我的發送端驅動程序」一詞。那麼,請您澄清一下「發送端」是什麼,以及您所談論的是什麼網絡驅動程序(在內核中運行)。 你很想找什麼是'sk_buff'引用計數器。你可以在你的'sk_buff'中增加字段'users'來表示釋放緩衝區是不安全的。該字段是http://elixir.free-electrons.com/linux/latest/source/include/linux/skbuff.h#L764。 –

+0

我正確更新了這個問題 –

回答

1

如果我沒有記錯,您可以在「發送端」使用緩衝區的skb_get()increment reference counter。這意味着一旦網絡驅動程序決定釋放緩衝區之後釋放緩衝區,它就會調用一個適當的函數來減少參考計數器,但它仍然會保持非零(因爲您之前的+ 1),所以它將不會被釋放。然後,您將可以隨時保存緩衝區並釋放它(因爲您是最後一位用戶)。

但是,如果您有sk_buff-s,恐怕您需要在每個段上執行skb_get()

至於您需要確保網絡驅動程序本身可以正確釋放緩衝區,例如,您可以在網絡驅動程序中找到緩衝區在傳輸時被釋放並插入調試打印輸出的位置。然後重新編譯,嘗試以正常方式與驅動程序進行交互(即事先未將skb_get()交給驅動程序)並觀察出現在dmesg中的調試打印輸出。

+0

謝謝。我會嘗試在網絡驅動程序中進行調試,因爲我擁有sk-buff-s鏈 –