TRACE_EVENT(kfree_skb,
 
        TP_PROTO(struct sk_buff *skb, void *location,
-                enum skb_drop_reason reason),
+                enum skb_drop_reason reason, struct sock *rx_sk),
 
-       TP_ARGS(skb, location, reason),
+       TP_ARGS(skb, location, reason, rx_sk),
 
        TP_STRUCT__entry(
                __field(void *,         skbaddr)
                __field(void *,         location)
+               __field(void *,         rx_sk)
                __field(unsigned short, protocol)
                __field(enum skb_drop_reason,   reason)
        ),
        TP_fast_assign(
                __entry->skbaddr = skb;
                __entry->location = location;
+               __entry->rx_sk = rx_sk;
                __entry->protocol = ntohs(skb->protocol);
                __entry->reason = reason;
        ),
 
-       TP_printk("skbaddr=%p protocol=%u location=%pS reason: %s",
-                 __entry->skbaddr, __entry->protocol, __entry->location,
+       TP_printk("skbaddr=%p rx_sk=%p protocol=%u location=%pS reason: %s",
+                 __entry->skbaddr, __entry->rx_sk, __entry->protocol,
+                 __entry->location,
                  __print_symbolic(__entry->reason,
                                   DEFINE_DROP_REASON(FN, FNe)))
 );
 
                                trace_consume_skb(skb, net_tx_action);
                        else
                                trace_kfree_skb(skb, net_tx_action,
-                                               get_kfree_skb_cb(skb)->reason);
+                                               get_kfree_skb_cb(skb)->reason, NULL);
 
                        if (skb->fclone != SKB_FCLONE_UNAVAILABLE)
                                __kfree_skb(skb);
 
 struct net_dm_alert_ops {
        void (*kfree_skb_probe)(void *ignore, struct sk_buff *skb,
                                void *location,
-                               enum skb_drop_reason reason);
+                               enum skb_drop_reason reason,
+                               struct sock *rx_sk);
        void (*napi_poll_probe)(void *ignore, struct napi_struct *napi,
                                int work, int budget);
        void (*work_item_func)(struct work_struct *work);
 
 static void trace_kfree_skb_hit(void *ignore, struct sk_buff *skb,
                                void *location,
-                               enum skb_drop_reason reason)
+                               enum skb_drop_reason reason,
+                               struct sock *rx_sk)
 {
        trace_drop_common(skb, location);
 }
 static void net_dm_packet_trace_kfree_skb_hit(void *ignore,
                                              struct sk_buff *skb,
                                              void *location,
-                                             enum skb_drop_reason reason)
+                                             enum skb_drop_reason reason,
+                                             struct sock *rx_sk)
 {
        ktime_t tstamp = ktime_get_real();
        struct per_cpu_dm_data *data;
 
        if (reason == SKB_CONSUMED)
                trace_consume_skb(skb, __builtin_return_address(0));
        else
-               trace_kfree_skb(skb, __builtin_return_address(0), reason);
+               trace_kfree_skb(skb, __builtin_return_address(0), reason, NULL);
        return true;
 }