函式 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); }