为什么一个skb不能同时在2个列表中排队?
我在另一个列表中对 skb 进行排队时观察到内核恐慌,即使它在原始列表中排队也是如此。让我举一个例子,即使我已经从原始队列中取消了 skb 的链接(但我还没有释放它),并且在尝试将 skb 排队到第二个列表时,我遇到了内核恐慌。
skb_unlink(skb, &sk->sk_receive_queue);
printk("%s %d", __func__, __LINE__);
skb_queue_tail(&sk->dup_queue, skb); /*Error*/
答案1
是的,我能够在内核中提供围绕相同概念的工作。由于 skb 没有被释放,即使它与第一个 skb 取消链接,分配给它的内存也没有被释放。解决方法是:
skb_unlink(skb, &sk->sk_receive_queue);
skb->destructor(skb);
skb_queue_tail(&sk->dup_queue, skb);
稍后从队列尾部释放 skbs 时执行以下操作:
skb->destructor = NULL; //As we have called it before
sk_eat_skb(skb);