skbバッファが同時に両方のリストにキューに入れられないのはなぜですか?

skbバッファが同時に両方のリストにキューに入れられないのはなぜですか?

なぜ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);

関連情報