Пример #1
0
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);
	}
}
Пример #3
0
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);
	}
}