2014-02-12 36 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。 –