我正在为linux内核开发一些网络驱动程序。它工作正常,但似乎有内存泄漏。我认为我怀疑使用的两个功能是:
skb2 = skb_realloc_headroom(skb, size);
skb2 = skb_copy_expand(skb, skb_headroom(skb), size, GFP_ATOMIC);
我的问题是 - 这些功能是否将skb的副本复制为skb2,我可以安全地免费获取skb?或者也许skb2只是扩展skb而我无法释放它们?
答案 0 :(得分:0)
第一次重新分配,释放原件。第二份副本,让你自由。
最简单的方法是查看现有驱动程序如何调用这些函数。因此,请在Linux Cross Reference上查找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);