void skb_release_data(struct sk_buff *skb) { if (!skb->cloned || atomic_dec_and_test(&(skb_shinfo(skb)->dataref))) { if (skb_shinfo(skb)->nr_frags) { int i; for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) put_page(skb_shinfo(skb)->frags[i].page); } if (skb_shinfo(skb)->frag_list) skb_drop_fraglist(skb); #if defined(CONFIG_MIPS_BRCM) /* * If skb->retfreeq_data_prealloc is 1, that means the data buffer 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_DATA_PREALLOC)) { (*skb->retfreeq_cb)(skb->retfreeq_context, skb->head, FREE_DATA); skb->retfreeq_flags &= ~SKB_DATA_PREALLOC; } else #endif kfree(skb->head); } }
static void skb_release_data(struct sk_buff *skb) { if (!skb->cloned || atomic_dec_and_test(&(skb_shinfo(skb)->dataref))) { if (skb_shinfo(skb)->nr_frags) { int i; for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) put_page(skb_shinfo(skb)->frags[i].page); } if (skb_shinfo(skb)->frag_list) skb_drop_fraglist(skb); kfree(skb->head); } }
static void skb_release_data(struct sk_buff *skb) { if (!skb->cloned || !atomic_sub_return(skb->nohdr ? (1 << SKB_DATAREF_SHIFT) + 1 : 1, &skb_shinfo(skb)->dataref)) { if (skb_shinfo(skb)->nr_frags) { int i; for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) put_page(skb_shinfo(skb)->frags[i].page); } if (skb_shinfo(skb)->frag_list) skb_drop_fraglist(skb); kfree(skb->head); } }