diff options
author | Madalin Bucur <madalin.bucur@freescale.com> | 2016-01-05 10:12:07 (GMT) |
---|---|---|
committer | Xie Xiaobo <xiaobo.xie@nxp.com> | 2017-07-14 10:08:27 (GMT) |
commit | 9527ee5eb436ad773acc7320b372a5f4825a920d (patch) | |
tree | acdea94ef6e99f180a4bbf1ac79fda2bab8d1b57 /net/core | |
parent | a3eb319e8158b55eac930676276ac81470721693 (diff) | |
download | linux-9527ee5eb436ad773acc7320b372a5f4825a920d.tar.xz |
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>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/skbuff.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index fe008f1..ab10380 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -825,6 +825,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) < \ |