我想在多个队列中排队skb buff。所以我想到了使用克隆选项。 现在我的问题是,如果我在克隆 skb上执行kfree_skb,它会释放原始skb,还是只删除一个引用?
谢谢!
答案 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_clone
:skb_copy
将sk_buff和数据包复制到新的内存区域。
编辑:编辑上一个回复并进行一些更正。