2014-02-12 70 views
1

我正在開發一些Linux內核的網絡驅動程序。它工作正常,但似乎有內存泄漏。我認爲這兩個功能我用懷疑:sk_buff結構函數和內存泄漏

skb2 = skb_realloc_headroom(skb, size); 

skb2 = skb_copy_expand(skb, skb_headroom(skb), size, GFP_ATOMIC); 

我的問題是 - 做這些功能使SKB的副本SKB2和我可以放心地免費SKB與否?或者,也許skb2只是擴大skb,我不能釋放他們?

回答

0

第一次重新分配,釋放原件。第二份,讓你免費兩個。

最簡單的方法是查看現有驅動程序如何調用這些函數。因此請在Linux Cross Reference上查找skb_realloc_headroomskb_copy_expand,並點擊幾個驅動程序的源代碼。

skb_realloc_headroom通常被稱爲是這樣的:

skb = skb_realloc_headroom(skb, size); 
... 
dev_kfree_skb(skb); 

...而skb_copy_expand被稱爲像這樣:

new_skb = skb_copy_expand(skb, skb_headroom(skb) + more_headroom, 
          skb_tailroom(skb), GFP_ATOMIC); 
... 
dev_kfree_skb(skb); 
dev_kfree_skb(new_skb); 
+0

skb_realloc_headroom不釋放原來的SKB!大多數情況下,我都可以在原件上找到調用consume_skb的東西。 consume_skb調用__kfree_skb。 –