porque o buffer skb não pode ser enfileirado em duas listas ao mesmo tempo?

0

por que um skb não pode ser enfileirado na lista 2 ao mesmo tempo?

Eu observei o kernel panic enquanto enfileirava skb em outra lista, mesmo que estivesse em fila na lista original. Deixe-me dar um exemplo onde, embora eu tenha desvinculado (mas não o tenha liberado) o skb da fila original e ao tentar enfileirar o skb na segunda lista, fico com o kernel panic.

skb_unlink(skb, &sk->sk_receive_queue);
 printk("%s %d", __func__, __LINE__);                                             
 skb_queue_tail(&sk->dup_queue, skb);  /*Error*/
    
por Kalu 29.06.2016 / 18:12

1 resposta

0

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);
    
por 17.07.2016 / 17:55