diff mbox series

[net-next] net/sock: Introduce trace_sk_data_ready()

Message ID 20220928221514.27350-1-yepeilin.cs@gmail.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series [net-next] net/sock: Introduce trace_sk_data_ready() | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next, async
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix success Link
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit fail Errors and warnings before: 69 this patch: 562
netdev/cc_maintainers warning 61 maintainers not CCed: steffen.klassert@secunet.com nhorman@tuxdriver.com dhowells@redhat.com leon@kernel.org kuniyu@amazon.com jgg@ziepe.ca ms@dev.tdt.de linux-afs@lists.infradead.org luiz.dentz@gmail.com vyasevich@gmail.com jmaloy@redhat.com virtualization@lists.linux-foundation.org rostedt@goodmis.org borisp@nvidia.com marc.dionne@auristor.com linux-sctp@vger.kernel.org mathew.j.martineau@linux.intel.com ralf@linux-mips.org jakub@cloudflare.com socketcan@hartkopp.net marcelo.leitner@gmail.com linux-hyperv@vger.kernel.org linux-s390@vger.kernel.org sthemmin@microsoft.com mptcp@lists.linux.dev fw@strlen.de tipc-discussion@lists.sourceforge.net linux-rdma@vger.kernel.org john.fastabend@gmail.com ast@kernel.org mkl@pengutronix.de linux-bluetooth@vger.kernel.org dccp@vger.kernel.org ying.xue@windriver.com marcel@holtmann.org wenjia@linux.ibm.com kys@microsoft.com herbert@gondor.apana.org.au haiyangz@microsoft.com linux-hams@vger.kernel.org wintera@linux.ibm.com bpf@vger.kernel.org wei.liu@kernel.org vinay.yadav@chelsio.com stefanha@redhat.com ayush.sawal@chelsio.com sgarzare@redhat.com decui@microsoft.com mingo@redhat.com kgraul@linux.ibm.com kvm@vger.kernel.org courmisch@gmail.com bmt@zurich.ibm.com matthieu.baerts@tessares.net jreuter@yaina.de pablo@netfilter.org rohitm@chelsio.com krzysztof.kozlowski@linaro.org johan.hedberg@gmail.com christophe.jaillet@wanadoo.fr linux-x25@vger.kernel.org
netdev/build_clang fail Errors and warnings before: 5 this patch: 603
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn fail Errors and warnings before: 76 this patch: 575
netdev/checkpatch warning CHECK: Alignment should match open parenthesis CHECK: Lines should not end with a '(' WARNING: function definition argument '__u16' should also have an identifier name WARNING: function definition argument 'const void *' should also have an identifier name WARNING: function definition argument 'struct sock *' should also have an identifier name WARNING: line length of 81 exceeds 80 columns
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Peilin Ye Sept. 28, 2022, 10:15 p.m. UTC
From: Peilin Ye <peilin.ye@bytedance.com>

As suggested by Cong, introduce a tracepoint for all ->sk_data_ready()
and ->saved_data_ready() call sites.  For example:

<...>
  cat-7011    [005] .....    92.018695: sk_data_ready: family=16 protocol=17 func=sock_def_readable
  cat-7012    [005] .....    93.612922: sk_data_ready: family=16 protocol=16 func=sock_def_readable
  cat-7013    [005] .....    94.653854: sk_data_ready: family=16 protocol=16 func=sock_def_readable
<...>

Suggested-by: Cong Wang <cong.wang@bytedance.com>
Signed-off-by: Peilin Ye <peilin.ye@bytedance.com>
---
 drivers/infiniband/sw/siw/siw_cm.c            |  6 ++++-
 .../chelsio/inline_crypto/chtls/chtls_cm.c    |  4 +++
 drivers/net/tun.c                             | 27 +++++++++++++------
 include/linux/skmsg.h                         |  8 ++++--
 include/trace/events/sock.h                   | 25 +++++++++++++++++
 net/atm/clip.c                                |  2 ++
 net/atm/lec.c                                 |  6 +++++
 net/atm/mpc.c                                 |  4 +++
 net/atm/raw.c                                 |  2 ++
 net/atm/signaling.c                           |  9 +++++--
 net/ax25/ax25_in.c                            |  5 +++-
 net/bluetooth/iso.c                           |  3 +++
 net/bluetooth/l2cap_sock.c                    | 10 +++++--
 net/bluetooth/rfcomm/sock.c                   |  3 +++
 net/bluetooth/sco.c                           |  2 ++
 net/caif/caif_socket.c                        |  7 +++--
 net/core/skmsg.c                              |  1 +
 net/core/sock.c                               |  4 ++-
 net/dccp/input.c                              |  2 ++
 net/dccp/minisocks.c                          |  5 +++-
 net/ipv4/tcp_input.c                          | 12 +++++++--
 net/ipv4/tcp_minisocks.c                      |  5 +++-
 net/ipv4/udp.c                                |  5 +++-
 net/iucv/af_iucv.c                            |  3 +++
 net/kcm/kcmsock.c                             |  5 +++-
 net/key/af_key.c                              |  2 ++
 net/mptcp/protocol.c                          |  6 ++++-
 net/mptcp/subflow.c                           |  2 ++
 net/netlink/af_netlink.c                      |  2 ++
 net/netrom/af_netrom.c                        |  5 +++-
 net/nfc/llcp_core.c                           |  2 ++
 net/packet/af_packet.c                        |  5 ++++
 net/phonet/pep.c                              | 13 ++++++---
 net/rose/af_rose.c                            |  5 +++-
 net/rxrpc/recvmsg.c                           |  2 ++
 net/sctp/stream_interleave.c                  |  3 +++
 net/sctp/ulpqueue.c                           |  3 +++
 net/smc/smc_close.c                           |  2 ++
 net/tipc/socket.c                             |  2 ++
 net/tipc/topsrv.c                             |  2 ++
 net/tls/tls_sw.c                              |  9 +++++--
 net/unix/af_unix.c                            |  6 +++++
 net/vmw_vsock/af_vsock.c                      |  5 +++-
 net/vmw_vsock/hyperv_transport.c              |  5 +++-
 net/vmw_vsock/virtio_transport_common.c       |  2 ++
 net/vmw_vsock/vmci_transport.c                |  2 ++
 net/x25/af_x25.c                              |  5 +++-
 net/x25/x25_in.c                              |  5 +++-
 net/xfrm/espintcp.c                           |  2 ++
 49 files changed, 225 insertions(+), 37 deletions(-)

Comments

Jakub Kicinski Sept. 29, 2022, 4:18 p.m. UTC | #1
On Wed, 28 Sep 2022 15:15:14 -0700 Peilin Ye wrote:
> From: Peilin Ye <peilin.ye@bytedance.com>
> 
> As suggested by Cong, introduce a tracepoint for all ->sk_data_ready()
> and ->saved_data_ready() call sites.  For example:

 warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
                 const void (*data_ready)(struct sock *)),

Please double check W=1 build before reposting
Eric Dumazet Sept. 29, 2022, 4:19 p.m. UTC | #2
On Wed, Sep 28, 2022 at 3:15 PM Peilin Ye <yepeilin.cs@gmail.com> wrote:
>
> From: Peilin Ye <peilin.ye@bytedance.com>
>
> As suggested by Cong, introduce a tracepoint for all ->sk_data_ready()
> and ->saved_data_ready() call sites.  For example:
>
> <...>
>   cat-7011    [005] .....    92.018695: sk_data_ready: family=16 protocol=17 func=sock_def_readable
>   cat-7012    [005] .....    93.612922: sk_data_ready: family=16 protocol=16 func=sock_def_readable
>   cat-7013    [005] .....    94.653854: sk_data_ready: family=16 protocol=16 func=sock_def_readable
> <...>
>
> Suggested-by: Cong Wang <cong.wang@bytedance.com>
> Signed-off-by: Peilin Ye <peilin.ye@bytedance.com>

I will not comment on if/why these tracepoints are useful, only on the
way you did this work.

I would rather split this in two parts.

First patch adding and using a common helper.

static inline void sock_data_ready(struct sock *sk)
{
     sk->sk_data_ready(sk);
}

s/sk->sk_data_ready(sk)/sock_data_ready(sk)/


Second patch adding the tracing point once in the helper ?

Alternatively, why not add the tracepoint directly in the called
functions (we have few of them),
instead of all call points ?
Peilin Ye Oct. 5, 2022, 12:06 a.m. UTC | #3
On Thu, Sep 29, 2022 at 09:18:40AM -0700, Jakub Kicinski wrote:
>  warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
>                  const void (*data_ready)(struct sock *)),
> 
> Please double check W=1 build before reposting

Sorry; should be "void (*const data_ready)(struct sock *)" instead.
Will fix in v2.

Peilin Ye
Peilin Ye Oct. 5, 2022, 12:14 a.m. UTC | #4
On Thu, Sep 29, 2022 at 09:19:34AM -0700, Eric Dumazet wrote:
> I would rather split this in two parts.
> 
> First patch adding and using a common helper.
> 
> static inline void sock_data_ready(struct sock *sk)
> {
>      sk->sk_data_ready(sk);
> }
> 
> s/sk->sk_data_ready(sk)/sock_data_ready(sk)/
> 
> 
> Second patch adding the tracing point once in the helper ?
> 
> Alternatively, why not add the tracepoint directly in the called
> functions (we have few of them),
> instead of all call points ?

Thanks for the suggestions.  I will move this tracepoint into callees in
v2.

Thanks,
Peilin Ye
Cong Wang Oct. 15, 2022, 8:07 p.m. UTC | #5
On Thu, Sep 29, 2022 at 09:19:34AM -0700, Eric Dumazet wrote:
> Second patch adding the tracing point once in the helper ?
> 
> Alternatively, why not add the tracepoint directly in the called
> functions (we have few of them),
> instead of all call points ?

Why do we want to give implementations of sk_data_ready() freedom
to not to call this trace_sk_data_ready()?

Thanks.
Eric Dumazet Oct. 15, 2022, 8:26 p.m. UTC | #6
On Sat, Oct 15, 2022 at 1:07 PM Cong Wang <xiyou.wangcong@gmail.com> wrote:
>
> On Thu, Sep 29, 2022 at 09:19:34AM -0700, Eric Dumazet wrote:
> > Second patch adding the tracing point once in the helper ?
> >
> > Alternatively, why not add the tracepoint directly in the called
> > functions (we have few of them),
> > instead of all call points ?
>
> Why do we want to give implementations of sk_data_ready() freedom
> to not to call this trace_sk_data_ready()?
>
> Thanks.

I proposed an alternative. Choose one, but not the one you do not like :/

The first proposition was to split the patch in a more logical way.

I think we have less sk_data_ready() functions than call sites, so
code size would be smaller,
but this is probably something we care about enough.
diff mbox series

Patch

diff --git a/drivers/infiniband/sw/siw/siw_cm.c b/drivers/infiniband/sw/siw/siw_cm.c
index f88d2971c2c6..cd58af4785f2 100644
--- a/drivers/infiniband/sw/siw/siw_cm.c
+++ b/drivers/infiniband/sw/siw/siw_cm.c
@@ -16,6 +16,7 @@ 
 #include <net/tcp.h>
 #include <linux/inet.h>
 #include <linux/tcp.h>
+#include <trace/events/sock.h>
 
 #include <rdma/iw_cm.h>
 #include <rdma/ib_verbs.h>
@@ -998,6 +999,7 @@  static void siw_cm_work_handler(struct work_struct *w)
 	struct siw_cm_work *work;
 	struct siw_cep *cep;
 	int release_cep = 0, rv = 0;
+	struct sock *sk;
 
 	work = container_of(w, struct siw_cm_work, work.work);
 	cep = work->cep;
@@ -1042,7 +1044,9 @@  static void siw_cm_work_handler(struct work_struct *w)
 			 * silently ignore the mpa packet.
 			 */
 			if (cep->state == SIW_EPSTATE_RDMA_MODE) {
-				cep->sock->sk->sk_data_ready(cep->sock->sk);
+				sk = cep->sock->sk;
+				trace_sk_data_ready(sk, sk->sk_data_ready);
+				sk->sk_data_ready(sk);
 				siw_dbg_cep(cep, "already in RDMA mode");
 			} else {
 				siw_dbg_cep(cep, "out of state: %d\n",
diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c
index f90bfba4b303..0a7c7a9e5d0b 100644
--- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c
+++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c
@@ -28,6 +28,7 @@ 
 #include <net/tls.h>
 #include <net/addrconf.h>
 #include <net/secure_seq.h>
+#include <trace/events/sock.h>
 
 #include "chtls.h"
 #include "chtls_cm.h"
@@ -1555,6 +1556,7 @@  static void add_pass_open_to_parent(struct sock *child, struct sock *lsk,
 	} else {
 		refcount_set(&oreq->rsk_refcnt, 1);
 		inet_csk_reqsk_queue_add(lsk, oreq, child);
+		trace_sk_data_ready(lsk, lsk->sk_data_ready);
 		lsk->sk_data_ready(lsk);
 	}
 }
@@ -1719,6 +1721,7 @@  static void chtls_recv_data(struct sock *sk, struct sk_buff *skb)
 
 	if (!sock_flag(sk, SOCK_DEAD)) {
 		check_sk_callbacks(csk);
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	}
 }
@@ -1840,6 +1843,7 @@  static void chtls_rx_hdr(struct sock *sk, struct sk_buff *skb)
 
 	if (!sock_flag(sk, SOCK_DEAD)) {
 		check_sk_callbacks(csk);
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	}
 }
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 3732e51b5ad8..ec9428a8903d 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -77,6 +77,7 @@ 
 #include <net/ax25.h>
 #include <net/rose.h>
 #include <net/6lowpan.h>
+#include <trace/events/sock.h>
 
 #include <linux/uaccess.h>
 #include <linux/proc_fs.h>
@@ -709,19 +710,24 @@  static void tun_detach_all(struct net_device *dev)
 	struct tun_struct *tun = netdev_priv(dev);
 	struct tun_file *tfile, *tmp;
 	int i, n = tun->numqueues;
+	struct sock *sk;
 
 	for (i = 0; i < n; i++) {
 		tfile = rtnl_dereference(tun->tfiles[i]);
 		BUG_ON(!tfile);
 		tun_napi_disable(tfile);
-		tfile->socket.sk->sk_shutdown = RCV_SHUTDOWN;
-		tfile->socket.sk->sk_data_ready(tfile->socket.sk);
+		sk = tfile->socket.sk;
+		sk->sk_shutdown = RCV_SHUTDOWN;
+		trace_sk_data_ready(sk, sk->sk_data_ready);
+		sk->sk_data_ready(sk);
 		RCU_INIT_POINTER(tfile->tun, NULL);
 		--tun->numqueues;
 	}
 	list_for_each_entry(tfile, &tun->disabled, next) {
-		tfile->socket.sk->sk_shutdown = RCV_SHUTDOWN;
-		tfile->socket.sk->sk_data_ready(tfile->socket.sk);
+		sk = tfile->socket.sk;
+		sk->sk_shutdown = RCV_SHUTDOWN;
+		trace_sk_data_ready(sk, sk->sk_data_ready);
+		sk->sk_data_ready(sk);
 		RCU_INIT_POINTER(tfile->tun, NULL);
 	}
 	BUG_ON(tun->numqueues != 0);
@@ -1073,6 +1079,7 @@  static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
 	struct netdev_queue *queue;
 	struct tun_file *tfile;
 	int len = skb->len;
+	struct sock *sk;
 
 	rcu_read_lock();
 	tfile = rcu_dereference(tun->tfiles[txq]);
@@ -1096,8 +1103,8 @@  static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
 		goto drop;
 	}
 
-	if (tfile->socket.sk->sk_filter &&
-	    sk_filter(tfile->socket.sk, skb)) {
+	sk = tfile->socket.sk;
+	if (sk->sk_filter && sk_filter(sk, skb)) {
 		drop_reason = SKB_DROP_REASON_SOCKET_FILTER;
 		goto drop;
 	}
@@ -1139,7 +1146,8 @@  static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
 	/* Notify and wake up reader process */
 	if (tfile->flags & TUN_FASYNC)
 		kill_fasync(&tfile->fasync, SIGIO, POLL_IN);
-	tfile->socket.sk->sk_data_ready(tfile->socket.sk);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
+	sk->sk_data_ready(sk);
 
 	rcu_read_unlock();
 	return NETDEV_TX_OK;
@@ -1260,10 +1268,13 @@  static const struct net_device_ops tun_netdev_ops = {
 
 static void __tun_xdp_flush_tfile(struct tun_file *tfile)
 {
+	struct sock *sk = tfile->socket.sk;
+
 	/* Notify and wake up reader process */
 	if (tfile->flags & TUN_FASYNC)
 		kill_fasync(&tfile->fasync, SIGIO, POLL_IN);
-	tfile->socket.sk->sk_data_ready(tfile->socket.sk);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
+	sk->sk_data_ready(sk);
 }
 
 static int tun_xdp_xmit(struct net_device *dev, int n,
diff --git a/include/linux/skmsg.h b/include/linux/skmsg.h
index 48f4b645193b..ccf4e1b94828 100644
--- a/include/linux/skmsg.h
+++ b/include/linux/skmsg.h
@@ -12,6 +12,7 @@ 
 #include <net/sock.h>
 #include <net/tcp.h>
 #include <net/strparser.h>
+#include <trace/events/sock.h>
 
 #define MAX_MSG_FRAGS			MAX_SKB_FRAGS
 #define NR_MSG_FRAG_IDS			(MAX_MSG_FRAGS + 1)
@@ -454,10 +455,13 @@  static inline void sk_psock_put(struct sock *sk, struct sk_psock *psock)
 
 static inline void sk_psock_data_ready(struct sock *sk, struct sk_psock *psock)
 {
-	if (psock->saved_data_ready)
+	if (psock->saved_data_ready) {
+		trace_sk_data_ready(sk, psock->saved_data_ready);
 		psock->saved_data_ready(sk);
-	else
+	} else {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 }
 
 static inline void psock_set_prog(struct bpf_prog **pprog,
diff --git a/include/trace/events/sock.h b/include/trace/events/sock.h
index 777ee6cbe933..22ed9065d874 100644
--- a/include/trace/events/sock.h
+++ b/include/trace/events/sock.h
@@ -263,6 +263,31 @@  TRACE_EVENT(inet_sk_error_report,
 		  __entry->error)
 );
 
+TRACE_EVENT(sk_data_ready,
+
+	TP_PROTO(const struct sock *sk,
+		 const void (*data_ready)(struct sock *)),
+
+	TP_ARGS(sk, data_ready),
+
+	TP_STRUCT__entry(
+		__field(const void *, skaddr)
+		__field(__u16, family)
+		__field(__u16, protocol)
+		__field(const void *, func)
+	),
+
+	TP_fast_assign(
+		__entry->skaddr = sk;
+		__entry->family = sk->sk_family;
+		__entry->protocol = sk->sk_protocol;
+		__entry->func = data_ready;
+	),
+
+	TP_printk("family=%u protocol=%u func=%ps", __entry->family,
+		  __entry->protocol, __entry->func)
+);
+
 #endif /* _TRACE_SOCK_H */
 
 /* This part must be outside protection */
diff --git a/net/atm/clip.c b/net/atm/clip.c
index 294cb9efe3d3..78b251fd5273 100644
--- a/net/atm/clip.c
+++ b/net/atm/clip.c
@@ -39,6 +39,7 @@ 
 #include <linux/uaccess.h>
 #include <asm/byteorder.h> /* for htons etc. */
 #include <linux/atomic.h>
+#include <trace/events/sock.h>
 
 #include "common.h"
 #include "resources.h"
@@ -69,6 +70,7 @@  static int to_atmarpd(enum atmarp_ctrl_type type, int itf, __be32 ip)
 
 	sk = sk_atm(atmarpd);
 	skb_queue_tail(&sk->sk_receive_queue, skb);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 	return 0;
 }
diff --git a/net/atm/lec.c b/net/atm/lec.c
index 6257bf12e5a0..8dd3036c1c20 100644
--- a/net/atm/lec.c
+++ b/net/atm/lec.c
@@ -26,6 +26,7 @@ 
 #include <linux/proc_fs.h>
 #include <linux/spinlock.h>
 #include <linux/seq_file.h>
+#include <trace/events/sock.h>
 
 /* And atm device */
 #include <linux/atmdev.h>
@@ -156,6 +157,7 @@  static void lec_handle_bridge(struct sk_buff *skb, struct net_device *dev)
 		atm_force_charge(priv->lecd, skb2->truesize);
 		sk = sk_atm(priv->lecd);
 		skb_queue_tail(&sk->sk_receive_queue, skb2);
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	}
 }
@@ -450,6 +452,7 @@  static int lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb)
 			atm_force_charge(priv->lecd, skb2->truesize);
 			sk = sk_atm(priv->lecd);
 			skb_queue_tail(&sk->sk_receive_queue, skb2);
+			trace_sk_data_ready(sk, sk->sk_data_ready);
 			sk->sk_data_ready(sk);
 		}
 	}
@@ -533,12 +536,14 @@  send_to_lecd(struct lec_priv *priv, atmlec_msg_type type,
 	atm_force_charge(priv->lecd, skb->truesize);
 	sk = sk_atm(priv->lecd);
 	skb_queue_tail(&sk->sk_receive_queue, skb);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 
 	if (data != NULL) {
 		pr_debug("about to send %d bytes of data\n", data->len);
 		atm_force_charge(priv->lecd, data->truesize);
 		skb_queue_tail(&sk->sk_receive_queue, data);
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	}
 
@@ -609,6 +614,7 @@  static void lec_push(struct atm_vcc *vcc, struct sk_buff *skb)
 
 		pr_debug("%s: To daemon\n", dev->name);
 		skb_queue_tail(&sk->sk_receive_queue, skb);
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	} else {		/* Data frame, queue to protocol handlers */
 		struct lec_arp_table *entry;
diff --git a/net/atm/mpc.c b/net/atm/mpc.c
index 033871e718a3..074abe53feb6 100644
--- a/net/atm/mpc.c
+++ b/net/atm/mpc.c
@@ -23,6 +23,7 @@ 
 #include <net/arp.h>
 #include <net/dst.h>
 #include <linux/proc_fs.h>
+#include <trace/events/sock.h>
 
 /* And atm device */
 #include <linux/atmdev.h>
@@ -706,6 +707,7 @@  static void mpc_push(struct atm_vcc *vcc, struct sk_buff *skb)
 		dprintk("(%s) control packet arrived\n", dev->name);
 		/* Pass control packets to daemon */
 		skb_queue_tail(&sk->sk_receive_queue, skb);
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 		return;
 	}
@@ -991,6 +993,7 @@  int msg_to_mpoad(struct k_message *mesg, struct mpoa_client *mpc)
 
 	sk = sk_atm(mpc->mpoad_vcc);
 	skb_queue_tail(&sk->sk_receive_queue, skb);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 
 	return 0;
@@ -1273,6 +1276,7 @@  static void purge_egress_shortcut(struct atm_vcc *vcc, eg_cache_entry *entry)
 
 	sk = sk_atm(vcc);
 	skb_queue_tail(&sk->sk_receive_queue, skb);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 	dprintk("exiting\n");
 }
diff --git a/net/atm/raw.c b/net/atm/raw.c
index 2b5f78a7ec3e..b98d0d17e420 100644
--- a/net/atm/raw.c
+++ b/net/atm/raw.c
@@ -12,6 +12,7 @@ 
 #include <linux/skbuff.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
+#include <trace/events/sock.h>
 
 #include "common.h"
 #include "protocols.h"
@@ -26,6 +27,7 @@  static void atm_push_raw(struct atm_vcc *vcc, struct sk_buff *skb)
 		struct sock *sk = sk_atm(vcc);
 
 		skb_queue_tail(&sk->sk_receive_queue, skb);
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	}
 }
diff --git a/net/atm/signaling.c b/net/atm/signaling.c
index 5de06ab8ed75..b38feb812eb8 100644
--- a/net/atm/signaling.c
+++ b/net/atm/signaling.c
@@ -16,6 +16,7 @@ 
 #include <linux/atmdev.h>
 #include <linux/bitops.h>
 #include <linux/slab.h>
+#include <trace/events/sock.h>
 
 #include "resources.h"
 #include "signaling.h"
@@ -24,14 +25,18 @@  struct atm_vcc *sigd = NULL;
 
 static void sigd_put_skb(struct sk_buff *skb)
 {
+	struct sock *sk;
+
 	if (!sigd) {
 		pr_debug("atmsvc: no signaling daemon\n");
 		kfree_skb(skb);
 		return;
 	}
 	atm_force_charge(sigd, skb->truesize);
-	skb_queue_tail(&sk_atm(sigd)->sk_receive_queue, skb);
-	sk_atm(sigd)->sk_data_ready(sk_atm(sigd));
+	sk = sk_atm(sigd);
+	skb_queue_tail(&sk->sk_receive_queue, skb);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
+	sk->sk_data_ready(sk);
 }
 
 static void modify_qos(struct atm_vcc *vcc, struct atmsvc_msg *msg)
diff --git a/net/ax25/ax25_in.c b/net/ax25/ax25_in.c
index 1cac25aca637..a8288735f96a 100644
--- a/net/ax25/ax25_in.c
+++ b/net/ax25/ax25_in.c
@@ -26,6 +26,7 @@ 
 #include <linux/fcntl.h>
 #include <linux/mm.h>
 #include <linux/interrupt.h>
+#include <trace/events/sock.h>
 
 /*
  *	Given a fragment, queue it on the fragment queue and if the fragment
@@ -417,8 +418,10 @@  static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
 	ax25_start_idletimer(ax25);
 
 	if (sk) {
-		if (!sock_flag(sk, SOCK_DEAD))
+		if (!sock_flag(sk, SOCK_DEAD)) {
+			trace_sk_data_ready(sk, sk->sk_data_ready);
 			sk->sk_data_ready(sk);
+		}
 		sock_put(sk);
 	} else {
 free:
diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
index 613039ba5dbf..cf4395873524 100644
--- a/net/bluetooth/iso.c
+++ b/net/bluetooth/iso.c
@@ -9,6 +9,7 @@ 
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
 #include <linux/sched/signal.h>
+#include <trace/events/sock.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
@@ -161,6 +162,7 @@  static void iso_chan_del(struct sock *sk, int err)
 	parent = bt_sk(sk)->parent;
 	if (parent) {
 		bt_accept_unlink(sk);
+		trace_sk_data_ready(parent, parent->sk_data_ready);
 		parent->sk_data_ready(parent);
 	} else {
 		sk->sk_state_change(sk);
@@ -1469,6 +1471,7 @@  static void iso_conn_ready(struct iso_conn *conn)
 			sk->sk_state = BT_CONNECTED;
 
 		/* Wake up parent */
+		trace_sk_data_ready(parent, parent->sk_data_ready);
 		parent->sk_data_ready(parent);
 
 		release_sock(parent);
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index ca8f07f3542b..7fc4c86b1e06 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -31,6 +31,7 @@ 
 #include <linux/export.h>
 #include <linux/filter.h>
 #include <linux/sched/signal.h>
+#include <trace/events/sock.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
@@ -1584,6 +1585,7 @@  static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
 
 		if (parent) {
 			bt_accept_unlink(sk);
+			trace_sk_data_ready(parent, parent->sk_data_ready);
 			parent->sk_data_ready(parent);
 		} else {
 			sk->sk_state_change(sk);
@@ -1645,8 +1647,10 @@  static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
 	sk->sk_state = BT_CONNECTED;
 	sk->sk_state_change(sk);
 
-	if (parent)
+	if (parent) {
+		trace_sk_data_ready(parent, parent->sk_data_ready);
 		parent->sk_data_ready(parent);
+	}
 
 	release_sock(sk);
 }
@@ -1658,8 +1662,10 @@  static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
 	lock_sock(sk);
 
 	parent = bt_sk(sk)->parent;
-	if (parent)
+	if (parent) {
+		trace_sk_data_ready(parent, parent->sk_data_ready);
 		parent->sk_data_ready(parent);
+	}
 
 	release_sock(sk);
 }
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
index 4bf4ea6cbb5e..d6af9bb8da1e 100644
--- a/net/bluetooth/rfcomm/sock.c
+++ b/net/bluetooth/rfcomm/sock.c
@@ -28,6 +28,7 @@ 
 #include <linux/export.h>
 #include <linux/debugfs.h>
 #include <linux/sched/signal.h>
+#include <trace/events/sock.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
@@ -55,6 +56,7 @@  static void rfcomm_sk_data_ready(struct rfcomm_dlc *d, struct sk_buff *skb)
 
 	atomic_add(skb->len, &sk->sk_rmem_alloc);
 	skb_queue_tail(&sk->sk_receive_queue, skb);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 
 	if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)
@@ -83,6 +85,7 @@  static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
 			sock_set_flag(sk, SOCK_ZAPPED);
 			bt_accept_unlink(sk);
 		}
+		trace_sk_data_ready(parent, parent->sk_data_ready);
 		parent->sk_data_ready(parent);
 	} else {
 		if (d->state == BT_CONNECTED)
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 1111da4e2f2b..7d611364952b 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -28,6 +28,7 @@ 
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
 #include <linux/sched/signal.h>
+#include <trace/events/sock.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
@@ -1316,6 +1317,7 @@  static void sco_conn_ready(struct sco_conn *conn)
 			sk->sk_state = BT_CONNECTED;
 
 		/* Wake up parent */
+		trace_sk_data_ready(parent, parent->sk_data_ready);
 		parent->sk_data_ready(parent);
 
 		release_sock(parent);
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
index 748be7253248..99addf07125a 100644
--- a/net/caif/caif_socket.c
+++ b/net/caif/caif_socket.c
@@ -26,6 +26,7 @@ 
 #include <net/caif/caif_layer.h>
 #include <net/caif/caif_dev.h>
 #include <net/caif/cfpkt.h>
+#include <trace/events/sock.h>
 
 MODULE_LICENSE("GPL");
 MODULE_ALIAS_NETPROTO(AF_CAIF);
@@ -150,10 +151,12 @@  static void caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
 		__skb_queue_tail(list, skb);
 	spin_unlock_irqrestore(&list->lock, flags);
 out:
-	if (queued)
+	if (queued) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
-	else
+	} else {
 		kfree_skb(skb);
+	}
 }
 
 /* Packet Receive Callback function called from CAIF Stack */
diff --git a/net/core/skmsg.c b/net/core/skmsg.c
index 188f8558d27d..68ea92ef147d 100644
--- a/net/core/skmsg.c
+++ b/net/core/skmsg.c
@@ -1114,6 +1114,7 @@  static void sk_psock_strp_data_ready(struct sock *sk)
 	psock = sk_psock(sk);
 	if (likely(psock)) {
 		if (tls_sw_has_ctx_rx(sk)) {
+			trace_sk_data_ready(sk, psock->saved_data_ready);
 			psock->saved_data_ready(sk);
 		} else {
 			write_lock_bh(&sk->sk_callback_lock);
diff --git a/net/core/sock.c b/net/core/sock.c
index eeb6cbac6f49..9a0ede730a7b 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -502,8 +502,10 @@  int __sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
 	__skb_queue_tail(list, skb);
 	spin_unlock_irqrestore(&list->lock, flags);
 
-	if (!sock_flag(sk, SOCK_DEAD))
+	if (!sock_flag(sk, SOCK_DEAD)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 	return 0;
 }
 EXPORT_SYMBOL(__sock_queue_rcv_skb);
diff --git a/net/dccp/input.c b/net/dccp/input.c
index 2cbb757a894f..5c42c6a4a356 100644
--- a/net/dccp/input.c
+++ b/net/dccp/input.c
@@ -11,6 +11,7 @@ 
 #include <linux/slab.h>
 
 #include <net/sock.h>
+#include <trace/events/sock.h>
 
 #include "ackvec.h"
 #include "ccid.h"
@@ -24,6 +25,7 @@  static void dccp_enqueue_skb(struct sock *sk, struct sk_buff *skb)
 	__skb_pull(skb, dccp_hdr(skb)->dccph_doff * 4);
 	__skb_queue_tail(&sk->sk_receive_queue, skb);
 	skb_set_owner_r(skb, sk);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 }
 
diff --git a/net/dccp/minisocks.c b/net/dccp/minisocks.c
index 64d805b27add..663f07576a52 100644
--- a/net/dccp/minisocks.c
+++ b/net/dccp/minisocks.c
@@ -15,6 +15,7 @@ 
 #include <net/sock.h>
 #include <net/xfrm.h>
 #include <net/inet_timewait_sock.h>
+#include <trace/events/sock.h>
 
 #include "ackvec.h"
 #include "ccid.h"
@@ -229,8 +230,10 @@  int dccp_child_process(struct sock *parent, struct sock *child,
 					     skb->len);
 
 		/* Wakeup parent, send SIGIO */
-		if (state == DCCP_RESPOND && child->sk_state != state)
+		if (state == DCCP_RESPOND && child->sk_state != state) {
+			trace_sk_data_ready(parent, parent->sk_data_ready);
 			parent->sk_data_ready(parent);
+		}
 	} else {
 		/* Alas, it is possible again, because we do lookup
 		 * in main socket hash table and lock on listening
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index bc2ea12221f9..86e44250affc 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -76,6 +76,7 @@ 
 #include <linux/ipsec.h>
 #include <asm/unaligned.h>
 #include <linux/errqueue.h>
+#include <trace/events/sock.h>
 #include <trace/events/tcp.h>
 #include <linux/jump_label_ratelimit.h>
 #include <net/busy_poll.h>
@@ -4795,6 +4796,7 @@  static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb)
 
 	if (unlikely(tcp_try_rmem_schedule(sk, skb, skb->truesize))) {
 		NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPOFODROP);
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 		tcp_drop_reason(sk, skb, SKB_DROP_REASON_PROTO_MEM);
 		return;
@@ -5000,8 +5002,10 @@  int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size)
 
 void tcp_data_ready(struct sock *sk)
 {
-	if (tcp_epollin_ready(sk, sk->sk_rcvlowat) || sock_flag(sk, SOCK_DONE))
+	if (tcp_epollin_ready(sk, sk->sk_rcvlowat) || sock_flag(sk, SOCK_DONE)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 }
 
 static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
@@ -5047,6 +5051,7 @@  static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
 		else if (tcp_try_rmem_schedule(sk, skb, skb->truesize)) {
 			reason = SKB_DROP_REASON_PROTO_MEM;
 			NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPRCVQDROP);
+			trace_sk_data_ready(sk, sk->sk_data_ready);
 			sk->sk_data_ready(sk);
 			goto drop;
 		}
@@ -5664,8 +5669,10 @@  static void tcp_urg(struct sock *sk, struct sk_buff *skb, const struct tcphdr *t
 			if (skb_copy_bits(skb, ptr, &tmp, 1))
 				BUG();
 			WRITE_ONCE(tp->urg_data, TCP_URG_VALID | tmp);
-			if (!sock_flag(sk, SOCK_DEAD))
+			if (!sock_flag(sk, SOCK_DEAD)) {
+				trace_sk_data_ready(sk, sk->sk_data_ready);
 				sk->sk_data_ready(sk);
+			}
 		}
 	}
 }
@@ -7018,6 +7025,7 @@  int tcp_conn_request(struct request_sock_ops *rsk_ops,
 			sock_put(fastopen_sk);
 			goto drop_and_free;
 		}
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 		bh_unlock_sock(fastopen_sk);
 		sock_put(fastopen_sk);
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
index 442838ab0253..fe528da25d78 100644
--- a/net/ipv4/tcp_minisocks.c
+++ b/net/ipv4/tcp_minisocks.c
@@ -22,6 +22,7 @@ 
 #include <net/tcp.h>
 #include <net/xfrm.h>
 #include <net/busy_poll.h>
+#include <trace/events/sock.h>
 
 static bool tcp_in_window(u32 seq, u32 end_seq, u32 s_win, u32 e_win)
 {
@@ -855,8 +856,10 @@  int tcp_child_process(struct sock *parent, struct sock *child,
 	if (!sock_owned_by_user(child)) {
 		ret = tcp_rcv_state_process(child, skb);
 		/* Wakeup parent, send SIGIO */
-		if (state == TCP_SYN_RECV && child->sk_state != state)
+		if (state == TCP_SYN_RECV && child->sk_state != state) {
+			trace_sk_data_ready(parent, parent->sk_data_ready);
 			parent->sk_data_ready(parent);
+		}
 	} else {
 		/* Alas, it is possible again, because we do lookup
 		 * in main socket hash table and lock on listening
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index d63118ce5900..3092962129f2 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -108,6 +108,7 @@ 
 #include <linux/static_key.h>
 #include <linux/btf_ids.h>
 #include <trace/events/skb.h>
+#include <trace/events/sock.h>
 #include <net/busy_poll.h>
 #include "udp_impl.h"
 #include <net/sock_reuseport.h>
@@ -1582,8 +1583,10 @@  int __udp_enqueue_schedule_skb(struct sock *sk, struct sk_buff *skb)
 	__skb_queue_tail(list, skb);
 	spin_unlock(&list->lock);
 
-	if (!sock_flag(sk, SOCK_DEAD))
+	if (!sock_flag(sk, SOCK_DEAD)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 
 	busylock_release(busy);
 	return 0;
diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c
index 498a0c35b7bb..7edc3890b9c1 100644
--- a/net/iucv/af_iucv.c
+++ b/net/iucv/af_iucv.c
@@ -31,6 +31,7 @@ 
 #include <asm/ebcdic.h>
 #include <asm/cpcmd.h>
 #include <linux/kmod.h>
+#include <trace/events/sock.h>
 
 #include <net/iucv/af_iucv.h>
 
@@ -1665,6 +1666,7 @@  static int iucv_callback_connreq(struct iucv_path *path,
 
 	/* Wake up accept */
 	nsk->sk_state = IUCV_CONNECTED;
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 	err = 0;
 fail:
@@ -1885,6 +1887,7 @@  static int afiucv_hs_callback_syn(struct sock *sk, struct sk_buff *skb)
 	if (!err) {
 		iucv_accept_enqueue(sk, nsk);
 		nsk->sk_state = IUCV_CONNECTED;
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	} else
 		iucv_sock_kill(nsk);
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
index 1215c863e1c4..3b1a5807a449 100644
--- a/net/kcm/kcmsock.c
+++ b/net/kcm/kcmsock.c
@@ -28,6 +28,7 @@ 
 #include <net/netns/generic.h>
 #include <net/sock.h>
 #include <uapi/linux/kcm.h>
+#include <trace/events/sock.h>
 
 unsigned int kcm_net_id;
 
@@ -206,8 +207,10 @@  static int kcm_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
 
 	skb_queue_tail(list, skb);
 
-	if (!sock_flag(sk, SOCK_DEAD))
+	if (!sock_flag(sk, SOCK_DEAD)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 
 	return 0;
 }
diff --git a/net/key/af_key.c b/net/key/af_key.c
index c85df5b958d2..17e3295945a3 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -28,6 +28,7 @@ 
 #include <net/xfrm.h>
 
 #include <net/sock.h>
+#include <trace/events/sock.h>
 
 #define _X2KEY(x) ((x) == XFRM_INF ? 0 : (x))
 #define _KEY2X(x) ((x) == 0 ? XFRM_INF : (x))
@@ -201,6 +202,7 @@  static int pfkey_broadcast_one(struct sk_buff *skb, gfp_t allocation,
 	if (skb) {
 		skb_set_owner_r(skb, sk);
 		skb_queue_tail(&sk->sk_receive_queue, skb);
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 		err = 0;
 	}
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 866dfad3cde6..27a62209ee68 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -26,6 +26,7 @@ 
 #include "protocol.h"
 #include "mib.h"
 
+#include <trace/events/sock.h>
 #define CREATE_TRACE_POINTS
 #include <trace/events/mptcp.h>
 
@@ -815,8 +816,10 @@  void mptcp_data_ready(struct sock *sk, struct sock *ssk)
 
 	/* Wake-up the reader only for in-sequence data */
 	mptcp_data_lock(sk);
-	if (move_skbs_to_msk(msk, ssk))
+	if (move_skbs_to_msk(msk, ssk)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 
 	mptcp_data_unlock(sk);
 }
@@ -910,6 +913,7 @@  static void mptcp_check_for_eof(struct mptcp_sock *msk)
 		sk->sk_shutdown |= RCV_SHUTDOWN;
 
 		smp_mb__before_atomic(); /* SHUTDOWN must be visible first */
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	}
 
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index c7d49fb6e7bd..8409e46c58d8 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -26,6 +26,7 @@ 
 #include "mib.h"
 
 #include <trace/events/mptcp.h>
+#include <trace/events/sock.h>
 
 static void mptcp_subflow_ops_undo_override(struct sock *ssk);
 
@@ -1382,6 +1383,7 @@  static void subflow_data_ready(struct sock *sk)
 		if (reqsk_queue_empty(&inet_csk(sk)->icsk_accept_queue))
 			return;
 
+		trace_sk_data_ready(parent, parent->sk_data_ready);
 		parent->sk_data_ready(parent);
 		return;
 	}
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index a662e8a5ff84..0532cb50701f 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -69,6 +69,7 @@ 
 #include <net/sock.h>
 #include <net/scm.h>
 #include <net/netlink.h>
+#include <trace/events/sock.h>
 #define CREATE_TRACE_POINTS
 #include <trace/events/netlink.h>
 
@@ -1263,6 +1264,7 @@  static int __netlink_sendskb(struct sock *sk, struct sk_buff *skb)
 	netlink_deliver_tap(sock_net(sk), skb);
 
 	skb_queue_tail(&sk->sk_receive_queue, skb);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 	return len;
 }
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
index 6f7f4392cffb..5998464f832b 100644
--- a/net/netrom/af_netrom.c
+++ b/net/netrom/af_netrom.c
@@ -40,6 +40,7 @@ 
 #include <net/tcp_states.h>
 #include <net/arp.h>
 #include <linux/init.h>
+#include <trace/events/sock.h>
 
 static int nr_ndevs = 4;
 
@@ -1015,8 +1016,10 @@  int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
 	sk_acceptq_added(sk);
 	skb_queue_head(&sk->sk_receive_queue, skb);
 
-	if (!sock_flag(sk, SOCK_DEAD))
+	if (!sock_flag(sk, SOCK_DEAD)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 
 	bh_unlock_sock(sk);
 	sock_put(sk);
diff --git a/net/nfc/llcp_core.c b/net/nfc/llcp_core.c
index 3364caabef8b..3e7ff57a8c65 100644
--- a/net/nfc/llcp_core.c
+++ b/net/nfc/llcp_core.c
@@ -10,6 +10,7 @@ 
 #include <linux/kernel.h>
 #include <linux/list.h>
 #include <linux/nfc.h>
+#include <trace/events/sock.h>
 
 #include "nfc.h"
 #include "llcp.h"
@@ -973,6 +974,7 @@  static void nfc_llcp_recv_connect(struct nfc_llcp_local *local,
 	new_sk->sk_state = LLCP_CONNECTED;
 
 	/* Wake the listening processes */
+	trace_sk_data_ready(parent, parent->sk_data_ready);
 	parent->sk_data_ready(parent);
 
 	/* Send CC */
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index d3f6db350de7..5925b58cb5de 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -93,6 +93,7 @@ 
 #include <linux/bpf.h>
 #include <net/compat.h>
 #include <linux/netfilter_netdev.h>
+#include <trace/events/sock.h>
 
 #include "internal.h"
 
@@ -829,6 +830,7 @@  static void prb_close_block(struct tpacket_kbdq_core *pkc1,
 	/* Flush the block */
 	prb_flush_block(pkc1, pbd1, status);
 
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 
 	pkc1->kactive_blk_num = GET_NEXT_PRB_BLK_NUM(pkc1);
@@ -2212,6 +2214,7 @@  static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
 	skb_clear_delivery_time(skb);
 	__skb_queue_tail(&sk->sk_receive_queue, skb);
 	spin_unlock(&sk->sk_receive_queue.lock);
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 	return 0;
 
@@ -2485,6 +2488,7 @@  static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
 		__packet_set_status(po, h.raw, status);
 		__clear_bit(slot_id, po->rx_ring.rx_owner_map);
 		spin_unlock(&sk->sk_receive_queue.lock);
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	} else if (po->tp_version == TPACKET_V3) {
 		prb_clear_blk_fill_status(&po->rx_ring);
@@ -2507,6 +2511,7 @@  static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
 	atomic_inc(&po->tp_drops);
 	is_drop_n_account = true;
 
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 	kfree_skb(copy_skb);
 	goto drop_n_restore;
diff --git a/net/phonet/pep.c b/net/phonet/pep.c
index 83ea13a50690..8bfa1b6b9420 100644
--- a/net/phonet/pep.c
+++ b/net/phonet/pep.c
@@ -22,6 +22,7 @@ 
 #include <net/phonet/phonet.h>
 #include <net/phonet/pep.h>
 #include <net/phonet/gprs.h>
+#include <trace/events/sock.h>
 
 /* sk_state values:
  * TCP_CLOSE		sock not in use yet
@@ -451,8 +452,10 @@  static int pipe_do_rcv(struct sock *sk, struct sk_buff *skb)
 	skb->dev = NULL;
 	skb_set_owner_r(skb, sk);
 	skb_queue_tail(queue, skb);
-	if (!sock_flag(sk, SOCK_DEAD))
+	if (!sock_flag(sk, SOCK_DEAD)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 	return NET_RX_SUCCESS;
 }
 
@@ -575,8 +578,10 @@  static int pipe_handler_do_rcv(struct sock *sk, struct sk_buff *skb)
 		skb->dev = NULL;
 		skb_set_owner_r(skb, sk);
 		skb_queue_tail(&sk->sk_receive_queue, skb);
-		if (!sock_flag(sk, SOCK_DEAD))
+		if (!sock_flag(sk, SOCK_DEAD)) {
+			trace_sk_data_ready(sk, sk->sk_data_ready);
 			sk->sk_data_ready(sk);
+		}
 		return NET_RX_SUCCESS;
 
 	case PNS_PEP_CONNECT_RESP:
@@ -683,8 +688,10 @@  static int pep_do_rcv(struct sock *sk, struct sk_buff *skb)
 		}
 		skb_queue_head(&sk->sk_receive_queue, skb);
 		sk_acceptq_added(sk);
-		if (!sock_flag(sk, SOCK_DEAD))
+		if (!sock_flag(sk, SOCK_DEAD)) {
+			trace_sk_data_ready(sk, sk->sk_data_ready);
 			sk->sk_data_ready(sk);
+		}
 		return NET_RX_SUCCESS;
 
 	case PNS_PEP_DISCONNECT_REQ:
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
index 36fefc3957d7..c063d639f1c5 100644
--- a/net/rose/af_rose.c
+++ b/net/rose/af_rose.c
@@ -43,6 +43,7 @@ 
 #include <net/tcp_states.h>
 #include <net/ip.h>
 #include <net/arp.h>
+#include <trace/events/sock.h>
 
 static int rose_ndevs = 10;
 
@@ -1055,8 +1056,10 @@  int rose_rx_call_request(struct sk_buff *skb, struct net_device *dev, struct ros
 
 	rose_start_heartbeat(make);
 
-	if (!sock_flag(sk, SOCK_DEAD))
+	if (!sock_flag(sk, SOCK_DEAD)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 
 	return 1;
 }
diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c
index 7e39c262fd79..90138ac63d94 100644
--- a/net/rxrpc/recvmsg.c
+++ b/net/rxrpc/recvmsg.c
@@ -14,6 +14,7 @@ 
 
 #include <net/sock.h>
 #include <net/af_rxrpc.h>
+#include <trace/events/sock.h>
 #include "ar-internal.h"
 
 /*
@@ -49,6 +50,7 @@  void rxrpc_notify_socket(struct rxrpc_call *call)
 
 			if (!sock_flag(sk, SOCK_DEAD)) {
 				_debug("call %ps", sk->sk_data_ready);
+				trace_sk_data_ready(sk, sk->sk_data_ready);
 				sk->sk_data_ready(sk);
 			}
 		}
diff --git a/net/sctp/stream_interleave.c b/net/sctp/stream_interleave.c
index bb22b71df7a3..497d37ef0c43 100644
--- a/net/sctp/stream_interleave.c
+++ b/net/sctp/stream_interleave.c
@@ -20,6 +20,7 @@ 
 #include <net/sctp/sm.h>
 #include <net/sctp/ulpevent.h>
 #include <linux/sctp.h>
+#include <trace/events/sock.h>
 
 static struct sctp_chunk *sctp_make_idatafrag_empty(
 					const struct sctp_association *asoc,
@@ -498,6 +499,7 @@  static int sctp_enqueue_event(struct sctp_ulpq *ulpq,
 
 	if (!sp->data_ready_signalled) {
 		sp->data_ready_signalled = 1;
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	}
 
@@ -1000,6 +1002,7 @@  static void sctp_intl_stream_abort_pd(struct sctp_ulpq *ulpq, __u16 sid,
 
 		if (!sp->data_ready_signalled) {
 			sp->data_ready_signalled = 1;
+			trace_sk_data_ready(sk, sk->sk_data_ready);
 			sk->sk_data_ready(sk);
 		}
 	}
diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c
index 0a8510a0c5e6..ba2b9c4e0095 100644
--- a/net/sctp/ulpqueue.c
+++ b/net/sctp/ulpqueue.c
@@ -27,6 +27,7 @@ 
 #include <net/sctp/structs.h>
 #include <net/sctp/sctp.h>
 #include <net/sctp/sm.h>
+#include <trace/events/sock.h>
 
 /* Forward declarations for internal helpers.  */
 static struct sctp_ulpevent *sctp_ulpq_reasm(struct sctp_ulpq *ulpq,
@@ -254,6 +255,7 @@  int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sk_buff_head *skb_list)
 	if (queue == &sk->sk_receive_queue && !sp->data_ready_signalled) {
 		if (!sock_owned_by_user(sk))
 			sp->data_ready_signalled = 1;
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	}
 	return 1;
@@ -1127,6 +1129,7 @@  void sctp_ulpq_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp)
 	/* If there is data waiting, send it up the socket now. */
 	if ((sctp_ulpq_clear_pd(ulpq) || ev) && !sp->data_ready_signalled) {
 		sp->data_ready_signalled = 1;
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	}
 }
diff --git a/net/smc/smc_close.c b/net/smc/smc_close.c
index 31db7438857c..9eb5c52eefef 100644
--- a/net/smc/smc_close.c
+++ b/net/smc/smc_close.c
@@ -14,6 +14,7 @@ 
 
 #include <net/sock.h>
 #include <net/tcp.h>
+#include <trace/events/sock.h>
 
 #include "smc.h"
 #include "smc_tx.h"
@@ -425,6 +426,7 @@  static void smc_close_passive_work(struct work_struct *work)
 	}
 
 wakeup:
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk); /* wakeup blocked rcvbuf consumers */
 	sk->sk_write_space(sk); /* wakeup blocked sndbuf producers */
 
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index f1c3b8eb4b3d..7db9cf1c5948 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -37,6 +37,7 @@ 
 
 #include <linux/rhashtable.h>
 #include <linux/sched/signal.h>
+#include <trace/events/sock.h>
 
 #include "core.h"
 #include "name_table.h"
@@ -2385,6 +2386,7 @@  static void tipc_sk_filter_rcv(struct sock *sk, struct sk_buff *skb,
 		skb_set_owner_r(skb, sk);
 		trace_tipc_sk_overlimit2(sk, skb, TIPC_DUMP_ALL,
 					 "rcvq >90% allocated!");
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
 	}
 }
diff --git a/net/tipc/topsrv.c b/net/tipc/topsrv.c
index 5522865deae9..4e138081f01a 100644
--- a/net/tipc/topsrv.c
+++ b/net/tipc/topsrv.c
@@ -43,6 +43,7 @@ 
 #include "bearer.h"
 #include <net/sock.h>
 #include <linux/module.h>
+#include <trace/events/sock.h>
 
 /* Number of messages to send before rescheduling */
 #define MAX_SEND_MSG_COUNT	25
@@ -476,6 +477,7 @@  static void tipc_topsrv_accept(struct work_struct *work)
 		write_unlock_bh(&newsk->sk_callback_lock);
 
 		/* Wake up receive process in case of 'SYN+' message */
+		trace_sk_data_ready(newsk, newsk->sk_data_ready);
 		newsk->sk_data_ready(newsk);
 	}
 }
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
index 264cf367e265..0667891f2fcd 100644
--- a/net/tls/tls_sw.c
+++ b/net/tls/tls_sw.c
@@ -43,6 +43,7 @@ 
 
 #include <net/strparser.h>
 #include <net/tls.h>
+#include <trace/events/sock.h>
 
 #include "tls.h"
 
@@ -2271,9 +2272,11 @@  int tls_rx_msg_size(struct tls_strparser *strp, struct sk_buff *skb)
 void tls_rx_msg_ready(struct tls_strparser *strp)
 {
 	struct tls_sw_context_rx *ctx;
+	struct sock *sk = strp->sk;
 
 	ctx = container_of(strp, struct tls_sw_context_rx, strp);
-	ctx->saved_data_ready(strp->sk);
+	trace_sk_data_ready(sk, ctx->saved_data_ready);
+	ctx->saved_data_ready(sk);
 }
 
 static void tls_data_ready(struct sock *sk)
@@ -2286,8 +2289,10 @@  static void tls_data_ready(struct sock *sk)
 
 	psock = sk_psock_get(sk);
 	if (psock) {
-		if (!list_empty(&psock->ingress_msg))
+		if (!list_empty(&psock->ingress_msg)) {
+			trace_sk_data_ready(sk, ctx->saved_data_ready);
 			ctx->saved_data_ready(sk);
+		}
 		sk_psock_put(sk, psock);
 	}
 }
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index c955c7253d4b..bdd140138c19 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -115,6 +115,7 @@ 
 #include <linux/freezer.h>
 #include <linux/file.h>
 #include <linux/btf_ids.h>
+#include <trace/events/sock.h>
 
 #include "scm.h"
 
@@ -1627,6 +1628,7 @@  static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr,
 	__skb_queue_tail(&other->sk_receive_queue, skb);
 	spin_unlock(&other->sk_receive_queue.lock);
 	unix_state_unlock(other);
+	trace_sk_data_ready(other, other->sk_data_ready);
 	other->sk_data_ready(other);
 	sock_put(other);
 	return 0;
@@ -2072,6 +2074,7 @@  static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
 	scm_stat_add(other, skb);
 	skb_queue_tail(&other->sk_receive_queue, skb);
 	unix_state_unlock(other);
+	trace_sk_data_ready(other, other->sk_data_ready);
 	other->sk_data_ready(other);
 	sock_put(other);
 	scm_destroy(&scm);
@@ -2136,6 +2139,7 @@  static int queue_oob(struct socket *sock, struct msghdr *msg, struct sock *other
 	skb_queue_tail(&other->sk_receive_queue, skb);
 	sk_send_sigurg(other);
 	unix_state_unlock(other);
+	trace_sk_data_ready(other, other->sk_data_ready);
 	other->sk_data_ready(other);
 
 	return err;
@@ -2228,6 +2232,7 @@  static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
 		scm_stat_add(other, skb);
 		skb_queue_tail(&other->sk_receive_queue, skb);
 		unix_state_unlock(other);
+		trace_sk_data_ready(other, other->sk_data_ready);
 		other->sk_data_ready(other);
 		sent += size;
 	}
@@ -2356,6 +2361,7 @@  static ssize_t unix_stream_sendpage(struct socket *socket, struct page *page,
 	unix_state_unlock(other);
 	mutex_unlock(&unix_sk(other)->iolock);
 
+	trace_sk_data_ready(other, other->sk_data_ready);
 	other->sk_data_ready(other);
 	scm_destroy(&scm);
 	return size;
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index ee418701cdee..1ad731eb1482 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -110,6 +110,7 @@ 
 #include <linux/workqueue.h>
 #include <net/sock.h>
 #include <net/af_vsock.h>
+#include <trace/events/sock.h>
 
 static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr);
 static void vsock_sk_destruct(struct sock *sk);
@@ -887,8 +888,10 @@  void vsock_data_ready(struct sock *sk)
 	struct vsock_sock *vsk = vsock_sk(sk);
 
 	if (vsock_stream_has_data(vsk) >= sk->sk_rcvlowat ||
-	    sock_flag(sk, SOCK_DONE))
+	    sock_flag(sk, SOCK_DONE)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 }
 EXPORT_SYMBOL_GPL(vsock_data_ready);
 
diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c
index 59c3e2697069..dfb753261440 100644
--- a/net/vmw_vsock/hyperv_transport.c
+++ b/net/vmw_vsock/hyperv_transport.c
@@ -14,6 +14,7 @@ 
 #include <net/sock.h>
 #include <net/af_vsock.h>
 #include <asm/hyperv-tlfs.h>
+#include <trace/events/sock.h>
 
 /* Older (VMBUS version 'VERSION_WIN10' or before) Windows hosts have some
  * stricter requirements on the hv_sock ring buffer size of six 4K pages.
@@ -251,8 +252,10 @@  static void hvs_channel_cb(void *ctx)
 	struct hvsock *hvs = vsk->trans;
 	struct vmbus_channel *chan = hvs->chan;
 
-	if (hvs_channel_readable(chan))
+	if (hvs_channel_readable(chan)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 
 	if (hv_get_bytes_to_write(&chan->outbound) > 0)
 		sk->sk_write_space(sk);
diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c
index 35863132f4f1..c7eb4771b9c0 100644
--- a/net/vmw_vsock/virtio_transport_common.c
+++ b/net/vmw_vsock/virtio_transport_common.c
@@ -17,6 +17,7 @@ 
 #include <net/sock.h>
 #include <net/af_vsock.h>
 
+#include <trace/events/sock.h>
 #define CREATE_TRACE_POINTS
 #include <trace/events/vsock_virtio_transport_common.h>
 
@@ -1223,6 +1224,7 @@  virtio_transport_recv_listen(struct sock *sk, struct virtio_vsock_pkt *pkt,
 
 	release_sock(child);
 
+	trace_sk_data_ready(sk, sk->sk_data_ready);
 	sk->sk_data_ready(sk);
 	return 0;
 }
diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c
index 842c94286d31..d79506d53009 100644
--- a/net/vmw_vsock/vmci_transport.c
+++ b/net/vmw_vsock/vmci_transport.c
@@ -26,6 +26,7 @@ 
 #include <linux/workqueue.h>
 #include <net/sock.h>
 #include <net/af_vsock.h>
+#include <trace/events/sock.h>
 
 #include "vmci_transport_notify.h"
 
@@ -1254,6 +1255,7 @@  vmci_transport_recv_connecting_server(struct sock *listener,
 	/* Callers of accept() will be waiting on the listening socket, not
 	 * the pending socket.
 	 */
+	trace_sk_data_ready(listener, listener->sk_data_ready);
 	listener->sk_data_ready(listener);
 
 	return 0;
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
index 3b55502b2965..3f252226c241 100644
--- a/net/x25/af_x25.c
+++ b/net/x25/af_x25.c
@@ -53,6 +53,7 @@ 
 #include <linux/init.h>
 #include <linux/compat.h>
 #include <linux/ctype.h>
+#include <trace/events/sock.h>
 
 #include <net/x25.h>
 #include <net/compat.h>
@@ -1080,8 +1081,10 @@  int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
 
 	x25_start_heartbeat(make);
 
-	if (!sock_flag(sk, SOCK_DEAD))
+	if (!sock_flag(sk, SOCK_DEAD)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 	rc = 1;
 	sock_put(sk);
 out:
diff --git a/net/x25/x25_in.c b/net/x25/x25_in.c
index b981a4828d08..7eb444723633 100644
--- a/net/x25/x25_in.c
+++ b/net/x25/x25_in.c
@@ -28,6 +28,7 @@ 
 #include <net/sock.h>
 #include <net/tcp_states.h>
 #include <net/x25.h>
+#include <trace/events/sock.h>
 
 static int x25_queue_rx_frame(struct sock *sk, struct sk_buff *skb, int more)
 {
@@ -73,8 +74,10 @@  static int x25_queue_rx_frame(struct sock *sk, struct sk_buff *skb, int more)
 
 	skb_set_owner_r(skbn, sk);
 	skb_queue_tail(&sk->sk_receive_queue, skbn);
-	if (!sock_flag(sk, SOCK_DEAD))
+	if (!sock_flag(sk, SOCK_DEAD)) {
+		trace_sk_data_ready(sk, sk->sk_data_ready);
 		sk->sk_data_ready(sk);
+	}
 
 	return 0;
 }
diff --git a/net/xfrm/espintcp.c b/net/xfrm/espintcp.c
index 974eb97b77d2..2f81405b4e05 100644
--- a/net/xfrm/espintcp.c
+++ b/net/xfrm/espintcp.c
@@ -6,6 +6,7 @@ 
 #include <net/espintcp.h>
 #include <linux/skmsg.h>
 #include <net/inet_common.h>
+#include <trace/events/sock.h>
 #if IS_ENABLED(CONFIG_IPV6)
 #include <net/ipv6_stubs.h>
 #endif
@@ -24,6 +25,7 @@  static void handle_nonesp(struct espintcp_ctx *ctx, struct sk_buff *skb,
 
 	memset(skb->cb, 0, sizeof(skb->cb));
 	skb_queue_tail(&ctx->ike_queue, skb);
+	trace_sk_data_ready(sk, ctx->saved_data_ready);
 	ctx->saved_data_ready(sk);
 }