函数 dev_queue_xmit()用于直接使用sk_buf发包,此函数有返回值,但是并不能通过
此函数返回值为0来说明包已经发送出去且可以立刻释放sk_buff内存。因为网卡发包是一个异步的过程,
比如ixgbe网卡驱动发包过程可以查看此文。因此,解决办法是在skb_buff->uers
没有减少的情况下,将其存放于链表,稍后再释放内存。比如:
dev\_queue\_xmit(send\_skb);
if (atomic\_read(&(send\_skb->users)) == ){
kmem\_cache\_free(skbuff\_head\_cache, send\_skb);
}
else
{
struct free\_slab \*ptr = kmem\_cache\_alloc(skbuff\_free\_cache, GFP\_ATOMIC & ~\_\_GFP\_DMA);
ptr->free\_mem = send\_skb;
spin\_lock(&lock);
list\_add(&ptr->list, &head\_free\_slab);
spin\_unlock(&lock);
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章