|
@@ -643,12 +643,10 @@ fastpath:
|
|
|
kmem_cache_free(skbuff_fclone_cache, fclones);
|
|
|
}
|
|
|
|
|
|
-static void skb_release_head_state(struct sk_buff *skb)
|
|
|
+void skb_release_head_state(struct sk_buff *skb)
|
|
|
{
|
|
|
skb_dst_drop(skb);
|
|
|
-#ifdef CONFIG_XFRM
|
|
|
- secpath_put(skb->sp);
|
|
|
-#endif
|
|
|
+ secpath_reset(skb);
|
|
|
if (skb->destructor) {
|
|
|
WARN_ON(in_irq());
|
|
|
skb->destructor(skb);
|
|
@@ -751,6 +749,24 @@ void consume_skb(struct sk_buff *skb)
|
|
|
}
|
|
|
EXPORT_SYMBOL(consume_skb);
|
|
|
|
|
|
+/**
|
|
|
+ * consume_stateless_skb - free an skbuff, assuming it is stateless
|
|
|
+ * @skb: buffer to free
|
|
|
+ *
|
|
|
+ * Works like consume_skb(), but this variant assumes that all the head
|
|
|
+ * states have been already dropped.
|
|
|
+ */
|
|
|
+void consume_stateless_skb(struct sk_buff *skb)
|
|
|
+{
|
|
|
+ if (!skb_unref(skb))
|
|
|
+ return;
|
|
|
+
|
|
|
+ trace_consume_skb(skb);
|
|
|
+ if (likely(skb->head))
|
|
|
+ skb_release_data(skb);
|
|
|
+ kfree_skbmem(skb);
|
|
|
+}
|
|
|
+
|
|
|
void __kfree_skb_flush(void)
|
|
|
{
|
|
|
struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);
|