我正在为Linux内核开发一些网络驱动程序。它运行良好,但似乎存在内存泄漏。我认为我使用的两个功能是可疑的:
skb2 = skb_realloc_headroom(skb, size);
skb2 = skb_copy_expand(skb, skb_headroom(skb), size, GFP_ATOMIC);
我的问题是-这些函数是否将skb复制为skb2,我是否可以安全地释放skb?或者SKB2只是扩展了SKB,我不能释放它们?
最佳答案
第一次重新分配,释放了原稿。第二份,让你们两个都自由。
要了解这一点,最简单的方法是查看现有驱动程序如何调用这些函数。因此,在linux交叉引用上查找skb_realloc_headroom或skb_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);