我正在为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_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);

10-01 12:57