为什么skb缓冲区不能同时在两个列表上排队?

为什么skb缓冲区不能同时在两个列表上排队?

为什么一个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);

相关内容