return true;
 }
 
-void __fix_address
-kfree_skb_reason(struct sk_buff *skb, enum skb_drop_reason reason);
+void __fix_address sk_skb_reason_drop(struct sock *sk, struct sk_buff *skb,
+                                     enum skb_drop_reason reason);
+
+static inline void
+kfree_skb_reason(struct sk_buff *skb, enum skb_drop_reason reason)
+{
+       sk_skb_reason_drop(NULL, skb, reason);
+}
 
 /**
  *     kfree_skb - free an sk_buff with 'NOT_SPECIFIED' reason
 
 EXPORT_SYMBOL(__kfree_skb);
 
 static __always_inline
-bool __kfree_skb_reason(struct sk_buff *skb, enum skb_drop_reason reason)
+bool __sk_skb_reason_drop(struct sock *sk, struct sk_buff *skb,
+                         enum skb_drop_reason reason)
 {
        if (unlikely(!skb_unref(skb)))
                return false;
        if (reason == SKB_CONSUMED)
                trace_consume_skb(skb, __builtin_return_address(0));
        else
-               trace_kfree_skb(skb, __builtin_return_address(0), reason, NULL);
+               trace_kfree_skb(skb, __builtin_return_address(0), reason, sk);
        return true;
 }
 
 /**
- *     kfree_skb_reason - free an sk_buff with special reason
+ *     sk_skb_reason_drop - free an sk_buff with special reason
+ *     @sk: the socket to receive @skb, or NULL if not applicable
  *     @skb: buffer to free
  *     @reason: reason why this skb is dropped
  *
- *     Drop a reference to the buffer and free it if the usage count has
- *     hit zero. Meanwhile, pass the drop reason to 'kfree_skb'
- *     tracepoint.
+ *     Drop a reference to the buffer and free it if the usage count has hit
+ *     zero. Meanwhile, pass the receiving socket and drop reason to
+ *     'kfree_skb' tracepoint.
  */
 void __fix_address
-kfree_skb_reason(struct sk_buff *skb, enum skb_drop_reason reason)
+sk_skb_reason_drop(struct sock *sk, struct sk_buff *skb, enum skb_drop_reason reason)
 {
-       if (__kfree_skb_reason(skb, reason))
+       if (__sk_skb_reason_drop(sk, skb, reason))
                __kfree_skb(skb);
 }
-EXPORT_SYMBOL(kfree_skb_reason);
+EXPORT_SYMBOL(sk_skb_reason_drop);
 
 #define KFREE_SKB_BULK_SIZE    16
 
        while (segs) {
                struct sk_buff *next = segs->next;
 
-               if (__kfree_skb_reason(segs, reason)) {
+               if (__sk_skb_reason_drop(NULL, segs, reason)) {
                        skb_poison_list(segs);
                        kfree_skb_add_bulk(segs, &sa, reason);
                }