繁体   English   中英

skb_dequeue()冻结Linux内核后的kfree_skb()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM