From 21187fcd084c83c7ad2410c8571bd1add7dc8232 Mon Sep 17 00:00:00 2001 From: Madalin Bucur Date: Tue, 5 Jan 2016 12:12:07 +0200 Subject: [PATCH] net: readd skb_recycle() Adding back skb_recycle() as it's used by the DPAA Ethernet driver. This was removed from the upstream kernel because it was lacking users. Signed-off-by: Madalin Bucur --- include/linux/skbuff.h | 1 + net/core/skbuff.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 8688f7adfda7..83d01a634062 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -1022,6 +1022,7 @@ void skb_dump(const char *level, const struct sk_buff *skb, bool full_pkt); void skb_tx_error(struct sk_buff *skb); void consume_skb(struct sk_buff *skb); void __consume_stateless_skb(struct sk_buff *skb); +void skb_recycle(struct sk_buff *skb); void __kfree_skb(struct sk_buff *skb); extern struct kmem_cache *skbuff_head_cache; diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 867e61df00db..af514f5bc459 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -919,6 +919,32 @@ void napi_consume_skb(struct sk_buff *skb, int budget) } EXPORT_SYMBOL(napi_consume_skb); +/** + * skb_recycle - clean up an skb for reuse + * @skb: buffer + * + * Recycles the skb to be reused as a receive buffer. This + * function does any necessary reference count dropping, and + * cleans up the skbuff as if it just came from __alloc_skb(). + */ +void skb_recycle(struct sk_buff *skb) +{ + struct skb_shared_info *shinfo; + u8 head_frag = skb->head_frag; + + skb_release_head_state(skb); + + shinfo = skb_shinfo(skb); + memset(shinfo, 0, offsetof(struct skb_shared_info, dataref)); + atomic_set(&shinfo->dataref, 1); + + memset(skb, 0, offsetof(struct sk_buff, tail)); + skb->data = skb->head + NET_SKB_PAD; + skb->head_frag = head_frag; + skb_reset_tail_pointer(skb); +} +EXPORT_SYMBOL(skb_recycle); + /* Make sure a field is enclosed inside headers_start/headers_end section */ #define CHECK_SKB_FIELD(field) \ BUILD_BUG_ON(offsetof(struct sk_buff, field) < \