}
 EXPORT_SYMBOL(__kfree_skb);
 
+static __always_inline
+bool __kfree_skb_reason(struct sk_buff *skb, enum skb_drop_reason reason)
+{
+       if (unlikely(!skb_unref(skb)))
+               return false;
+
+       DEBUG_NET_WARN_ON_ONCE(reason <= 0 || reason >= SKB_DROP_REASON_MAX);
+
+       if (reason == SKB_CONSUMED)
+               trace_consume_skb(skb);
+       else
+               trace_kfree_skb(skb, __builtin_return_address(0), reason);
+       return true;
+}
+
 /**
  *     kfree_skb_reason - free an sk_buff with special reason
  *     @skb: buffer to free
 void __fix_address
 kfree_skb_reason(struct sk_buff *skb, enum skb_drop_reason reason)
 {
-       if (unlikely(!skb_unref(skb)))
-               return;
-
-       DEBUG_NET_WARN_ON_ONCE(reason <= 0 || reason >= SKB_DROP_REASON_MAX);
-
-       if (reason == SKB_CONSUMED)
-               trace_consume_skb(skb);
-       else
-               trace_kfree_skb(skb, __builtin_return_address(0), reason);
-       __kfree_skb(skb);
+       if (__kfree_skb_reason(skb, reason))
+               __kfree_skb(skb);
 }
 EXPORT_SYMBOL(kfree_skb_reason);
 
-void kfree_skb_list_reason(struct sk_buff *segs,
-                          enum skb_drop_reason reason)
+void __fix_address
+kfree_skb_list_reason(struct sk_buff *segs, enum skb_drop_reason reason)
 {
        while (segs) {
                struct sk_buff *next = segs->next;
 
-               kfree_skb_reason(segs, reason);
+               if (__kfree_skb_reason(segs, reason))
+                       __kfree_skb(segs);
                segs = next;
        }
 }