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

관련 정보