Sim, eu sou capaz de fornecer um trabalho em torno do mesmo conceito no kernel. Como os skbs não são liberados mesmo que ele seja desvinculado dos primeiros skbs, a memória designada a ele não é liberada. A solução alternativa é:
skb_unlink(skb, &sk->sk_receive_queue);
skb->destructor(skb);
skb_queue_tail(&sk->dup_queue, skb);
Mais tarde, ao liberar os skbs da fila, faça:
skb->destructor = NULL; //As we have called it before
sk_eat_skb(skb);