2015-05-20 447 views
0

當我與客戶保持連接時,我收到來自每個客戶的報告。一段時間後,程序崩潰,我收到一條錯誤消息:Linux skb alloc失敗

skb分配失敗。

我該怎麼辦?

+0

更多詳情代碼信息請 –

回答

0

您提供的信息太不完整,無法預測。但是,網絡套接字的問題主要在於緩衝區分配。 skbuffs是Linux內核處理網絡數據包的緩衝區。當您保持與客戶端的連接並接收數據包時,數據包在內部被網卡接收,填入skbuff並傳遞到網絡堆棧。

看什麼alloc_skb()返回。閱讀手冊頁知道,如果alloc_skb()返回NULL,沒有內存分配您想要的塊。這可能是分配失敗情況之一。

順便說一句,希望你在中斷的基礎上駕駛整個事情。 alloc_skb()的手冊頁說,

緩衝區只能使用GFP_ATOMIC的gfp_mask從中斷分配。

無論內存情況如何,傳遞數據的最佳方式就是中斷處理程序。當驅動程序加載時,可以創建一個skb列表。並且,在中斷過程中,執行alloc_skb,如果失敗,您可以始終使用其中一個預分配的緩衝區(如果有的話)保存數據。爲了下一次中斷髮生,補充緩衝區。