0

通常,sk_buff是由我在发送端通过“alloc_skb”开发并发送给网络驱动程序的模块(网络驱动程序的接口)分配的。它在发送后基本上由网络驱动程序释放。检测/确保SKB分配和释放

有没有办法让我的开发模块免费SKB或有没有办法确保网络驱动程序是否正确释放skb buff?

+0

你说“发送方”是什么意思?因为稍后您将其与“网络驱动程序”区分开来,最后您还会使用“我的发送端驱动程序”一词。那么,请您澄清一下“发送端”是什么,以及您所谈论的是什么网络驱动程序(在内核中运行)。 你很想找什么是'sk_buff'引用计数器。你可以在你的'sk_buff'中增加字段'users'来表示释放缓冲区是不安全的。该字段是http://elixir.free-electrons.com/linux/latest/source/include/linux/skbuff.h#L764。 –

+0

我正确更新了这个问题 –

回答

1

如果我没有记错,您可以在“发送端”使用缓冲区的skb_get()increment reference counter。这意味着一旦网络驱动程序决定释放缓冲区之后释放缓冲区,它就会调用一个适当的函数来减少参考计数器,但它仍然会保持非零(因为您之前的+ 1),所以它将不会被释放。然后,您将可以随时保存缓冲区并释放它(因为您是最后一位用户)。

但是,如果您有sk_buff-s,恐怕您需要在每个段上执行skb_get()

至于您需要确保网络驱动程序本身可以正确释放缓冲区,例如,您可以在网络驱动程序中找到缓冲区在传输时被释放并插入调试打印输出的位置。然后重新编译,尝试以正常方式与驱动程序进行交互(即事先未将skb_get()交给驱动程序)并观察出现在dmesg中的调试打印输出。

+0

谢谢。我会尝试在网络驱动程序中进行调试,因为我拥有sk-buff-s链 –