释放克隆skb(使用skb_clone)将释放原始skb?

时间:2013-11-11 12:30:23

标签: linux linux-kernel kernel

我想在多个队列中排队skb buff。所以我想到了使用克隆选项。 现在我的问题是,如果我在克隆 skb上执行kfree_skb,它会释放原始skb,还是只删除一个引用?

谢谢!

2 个答案:

答案 0 :(得分:3)

kfree_skb()将使用克隆的skbuff做正确的事情,即释放skbuff结构本身但不释放数据,如果它仍被其他skbuff引用。

这是在skb_release_data()上完成的,它检查skbuff是否不是克隆,或者这是否是对skb->data的最后一次引用(以支持无头skbuff的环形方式完成,其中包含引用到skb->data的有效载荷部分(skb->dataref的高16位),除了通常引用整个skb->data)。

答案 1 :(得分:2)

当创建skb的克隆时,为克隆的sk_buff分配新内存,并且克隆的所有struct sk_buff成员都是克隆的私有。 然而,数据即数据包在原始SKB和它的克隆之间共享。因此sk_buff结构仅复制到新内存。如果释放原始skb,则如果dataref计数为零,则数据将丢失。这里的数据是您的数据包。

如果您不想在释放任何skb时丢失数据,请使用skb_copy而不是skb_cloneskb_copy将sk_buff和数据包复制到新的内存区域。

编辑:编辑上一个回复并进行一些更正。