왜 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);