なぜskbは同時に2つのリストにキューに追加できないのですか?
skbを元のリストにキューに入れたにもかかわらず、別のリストにキューに入れるとカーネルパニックが発生することが観察されました。たとえば、見てみましょう。元のキューからskbを切断したが(まだリリースしていない)、skbを2番目のリストにキューに追加しようとするとカーネルパニックが発生します。
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);