/* * Free an skbuff by memory without cleaning the state. */ void kfree_skbmem(struct sk_buff *skb) { struct sk_buff *other; atomic_t *fclone_ref; skb_release_data(skb); switch (skb->fclone) { case SKB_FCLONE_UNAVAILABLE: kmem_cache_free(skbuff_head_cache, skb); break; case SKB_FCLONE_ORIG: fclone_ref = (atomic_t *) (skb + 2); if (atomic_dec_and_test(fclone_ref)) kmem_cache_free(skbuff_fclone_cache, skb); break; case SKB_FCLONE_CLONE: fclone_ref = (atomic_t *) (skb + 1); other = skb - 1; /* The clone portion is available for * fast-cloning again. */ skb->fclone = SKB_FCLONE_UNAVAILABLE; if (atomic_dec_and_test(fclone_ref)) kmem_cache_free(skbuff_fclone_cache, other); break; }; }
/* * Free an skbuff by memory without cleaning the state. */ void kfree_skbmem(struct sk_buff *skb) { skb_release_data(skb); #if defined(CONFIG_MIPS_BRCM) /* * If skb->retfreeq_skb_prealloc is 1, that means the skb was pre-allocated * by our network driver. (songw) */ /*MODIFY BY YINHENG FOR WMM FEATURE OF 3.12 WIFI DRIVER*/ if (skb->retfreeq_cb && (skb->retfreeq_flags & SKB_PREALLOC)) (*skb->retfreeq_cb)(skb->retfreeq_context, skb, FREE_SKB); else #endif kmem_cache_free(skbuff_head_cache, skb); }
/* Free everything but the sk_buff shell. */ static void skb_release_all(struct sk_buff *skb) { skb_release_head_state(skb); skb_release_data(skb); }
/* * Free an skbuff by memory without cleaning the state. */ void kfree_skbmem(struct sk_buff *skb) { skb_release_data(skb); skb_head_to_pool(skb); }
/* * Free an skbuff by memory without cleaning the state. */ void kfree_skbmem(struct sk_buff *skb) { skb_release_data(skb); kmem_cache_free(skbuff_head_cache, skb); }
/* * Free an skbuff by memory without cleaning the state. */ void kfree_skbmem(struct sk_buff *skb) { skb_release_data(skb); kfree(skb); }