|
@@ -275,12 +275,11 @@ static void skb_release_data(struct sk_buff *skb)
|
|
|
/*
|
|
|
* Free an skbuff by memory without cleaning the state.
|
|
|
*/
|
|
|
-void kfree_skbmem(struct sk_buff *skb)
|
|
|
+static void kfree_skbmem(struct sk_buff *skb)
|
|
|
{
|
|
|
struct sk_buff *other;
|
|
|
atomic_t *fclone_ref;
|
|
|
|
|
|
- skb_release_data(skb);
|
|
|
switch (skb->fclone) {
|
|
|
case SKB_FCLONE_UNAVAILABLE:
|
|
|
kmem_cache_free(skbuff_head_cache, skb);
|
|
@@ -307,16 +306,8 @@ void kfree_skbmem(struct sk_buff *skb)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * __kfree_skb - private function
|
|
|
- * @skb: buffer
|
|
|
- *
|
|
|
- * Free an sk_buff. Release anything attached to the buffer.
|
|
|
- * Clean the state. This is an internal helper function. Users should
|
|
|
- * always call kfree_skb
|
|
|
- */
|
|
|
-
|
|
|
-void __kfree_skb(struct sk_buff *skb)
|
|
|
+/* Free everything but the sk_buff shell. */
|
|
|
+static void skb_release_all(struct sk_buff *skb)
|
|
|
{
|
|
|
dst_release(skb->dst);
|
|
|
#ifdef CONFIG_XFRM
|
|
@@ -340,7 +331,21 @@ void __kfree_skb(struct sk_buff *skb)
|
|
|
skb->tc_verd = 0;
|
|
|
#endif
|
|
|
#endif
|
|
|
+ skb_release_data(skb);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * __kfree_skb - private function
|
|
|
+ * @skb: buffer
|
|
|
+ *
|
|
|
+ * Free an sk_buff. Release anything attached to the buffer.
|
|
|
+ * Clean the state. This is an internal helper function. Users should
|
|
|
+ * always call kfree_skb
|
|
|
+ */
|
|
|
|
|
|
+void __kfree_skb(struct sk_buff *skb)
|
|
|
+{
|
|
|
+ skb_release_all(skb);
|
|
|
kfree_skbmem(skb);
|
|
|
}
|
|
|
|
|
@@ -441,7 +446,7 @@ static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb)
|
|
|
*/
|
|
|
struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src)
|
|
|
{
|
|
|
- skb_release_data(dst);
|
|
|
+ skb_release_all(dst);
|
|
|
return __skb_clone(dst, src);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(skb_morph);
|