1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- From abc24ef7a69f54c3317beea98078831ba9bfa2cd Mon Sep 17 00:00:00 2001
- From: Madalin Bucur <madalin.bucur@freescale.com>
- Date: Tue, 5 Jan 2016 12:12:07 +0200
- Subject: [PATCH 19/70] 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 <madalin.bucur@freescale.com>
- ---
- include/linux/skbuff.h | 1 +
- net/core/skbuff.c | 26 ++++++++++++++++++++++++++
- 2 files changed, 27 insertions(+)
- --- a/include/linux/skbuff.h
- +++ b/include/linux/skbuff.h
- @@ -804,6 +804,7 @@ void kfree_skb(struct sk_buff *skb);
- void kfree_skb_list(struct sk_buff *segs);
- void skb_tx_error(struct sk_buff *skb);
- void consume_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;
-
- --- a/net/core/skbuff.c
- +++ b/net/core/skbuff.c
- @@ -770,6 +770,32 @@ void consume_skb(struct sk_buff *skb)
- }
- EXPORT_SYMBOL(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) < \
|