]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: Add BPF_SOCK_OPS_TSTAMP_SENDMSG_CB callback
authorJason Xing <kerneljasonxing@gmail.com>
Thu, 20 Feb 2025 07:29:38 +0000 (15:29 +0800)
committerMartin KaFai Lau <martin.lau@kernel.org>
Thu, 20 Feb 2025 22:29:48 +0000 (14:29 -0800)
This patch introduces a new callback in tcp_tx_timestamp() to correlate
tcp_sendmsg timestamp with timestamps from other tx timestamping
callbacks (e.g., SND/SW/ACK).

Without this patch, BPF program wouldn't know which timestamps belong
to which flow because of no socket lock protection. This new callback
is inserted in tcp_tx_timestamp() to address this issue because
tcp_tx_timestamp() still owns the same socket lock with
tcp_sendmsg_locked() in the meanwhile tcp_tx_timestamp() initializes
the timestamping related fields for the skb, especially tskey. The
tskey is the bridge to do the correlation.

For TCP, BPF program hooks the beginning of tcp_sendmsg_locked() and
then stores the sendmsg timestamp at the bpf_sk_storage, correlating
this timestamp with its tskey that are later used in other sending
timestamping callbacks.

Signed-off-by: Jason Xing <kerneljasonxing@gmail.com>
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20250220072940.99994-11-kerneljasonxing@gmail.com
include/uapi/linux/bpf.h
net/ipv4/tcp.c
tools/include/uapi/linux/bpf.h

index cc10104f34a0a4884b35ef9c2b0b945fbdcecc34..defa5bb881f42c428c48c2019afb2ed8b1d66e8c 100644 (file)
@@ -7049,6 +7049,11 @@ enum {
                                         * when SK_BPF_CB_TX_TIMESTAMPING
                                         * feature is on.
                                         */
+       BPF_SOCK_OPS_TSTAMP_SENDMSG_CB, /* Called when every sendmsg syscall
+                                        * is triggered. It's used to correlate
+                                        * sendmsg timestamp with corresponding
+                                        * tskey.
+                                        */
 };
 
 /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect
index 2171e2f045bbfcb46d74095bd88c54275341c379..298d1da05bee6223b72c47abcb0335d796201c95 100644 (file)
@@ -496,6 +496,10 @@ static void tcp_tx_timestamp(struct sock *sk, struct sockcm_cookie *sockc)
                if (tsflags & SOF_TIMESTAMPING_TX_RECORD_MASK)
                        shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1;
        }
+
+       if (cgroup_bpf_enabled(CGROUP_SOCK_OPS) &&
+           SK_BPF_CB_FLAG_TEST(sk, SK_BPF_CB_TX_TIMESTAMPING) && skb)
+               bpf_skops_tx_timestamping(sk, skb, BPF_SOCK_OPS_TSTAMP_SENDMSG_CB);
 }
 
 static bool tcp_stream_is_readable(struct sock *sk, int target)
index cc10104f34a0a4884b35ef9c2b0b945fbdcecc34..defa5bb881f42c428c48c2019afb2ed8b1d66e8c 100644 (file)
@@ -7049,6 +7049,11 @@ enum {
                                         * when SK_BPF_CB_TX_TIMESTAMPING
                                         * feature is on.
                                         */
+       BPF_SOCK_OPS_TSTAMP_SENDMSG_CB, /* Called when every sendmsg syscall
+                                        * is triggered. It's used to correlate
+                                        * sendmsg timestamp with corresponding
+                                        * tskey.
+                                        */
 };
 
 /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect