函数 dev_queue_xmit()用于直接使用sk_buf发包,此函数有返回值,但是并不能通过
此函数返回值为0来说明包已经发送出去且可以立刻释放sk_buff内存。因为网卡发包是一个异步的过程,
比如ixgbe网卡驱动发包过程可以查看。因此,解决办法是在skb_buff->uers
没有减少的情况下,将其存放于链表,稍后再释放内存。比如:
dev_queue_xmit(send_skb); if (atomic_read(&(send_skb->users)) == 1){ 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); }