2c35899d81
All modification made by update_kernel.sh in a fresh clone without existing toolchains. Build system: x86_64 Build-tested: ipq806x/R7800, bcm27xx/bcm2711 Run-tested: ipq806x/R7800 Compile-tested [*]: ath79/{tiny,generic}, ipq40xx, octeon, ramips/mt7621, realtek, x86/64 Run-tested [*]: ath79/generic, ipq40xx, octeon, ramips/mt7621 No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> Tested-by: Stijn Segers <foss@volatilesystems.org> [*]
60 lines
1.9 KiB
Diff
60 lines
1.9 KiB
Diff
From 446a17652a69f749dd7a50b28e984c4904dc3aaf 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] 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
|
|
@@ -1025,6 +1025,7 @@ void skb_dump(const char *level, const s
|
|
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;
|
|
|
|
--- a/net/core/skbuff.c
|
|
+++ b/net/core/skbuff.c
|
|
@@ -945,6 +945,32 @@ void napi_consume_skb(struct sk_buff *sk
|
|
}
|
|
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) < \
|