[英]kfree_skb() after skb_dequeue() freezes linux kernel
我正在Linux内核的自定义协议中实现流控制。 当我收到ACK时,我想从写队列中删除确认的数据包。 这是一些代码
for(i = (ack->sequence - qp->first_unack); i>0&&sk->sk_write_queue.qlen>0; i++){
skb_del = skb_dequeue(&sk->sk_write_queue);
qp->first_unack++;
kfree_skb(skb_del);
}
我从这段代码中冻结了内核。 但是,当我注释掉kfree(skb_del)
时,一切正常。 任何想法为什么会这样? 我还能如何释放内存?
由于skb排队到套接字中,因此您可以使用已经提供的套接字API。
sk_eat_skb(struct sock *sk, struct sk_buff *skb, bool copied_early) // copied_ealy = 0
有关更多详细信息,您可以跟踪tcp_recvmsg,在那里您将正确获得注入流
此外,您为什么还要自己从排队/出队循环中使用自定义API。 只需浏览include/net/sock.h
我希望您会获得必要的详细信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.