Commit 6b98ec7e authored by Jason Xing's avatar Jason Xing Committed by Martin KaFai Lau
Browse files

bpf: Add BPF_SOCK_OPS_TSTAMP_SCHED_CB callback



Support SCM_TSTAMP_SCHED case for bpf timestamping.

Add a new sock_ops callback, BPF_SOCK_OPS_TSTAMP_SCHED_CB. This
callback will occur at the same timestamping point as the user
space's SCM_TSTAMP_SCHED. The BPF program can use it to get the
same SCM_TSTAMP_SCHED timestamp without modifying the user-space
application.

A new SKBTX_BPF flag is added to mark skb_shinfo(skb)->tx_flags,
ensuring that the new BPF timestamping and the current user
space's SO_TIMESTAMPING do not interfere with each other.

Signed-off-by: default avatarJason Xing <kerneljasonxing@gmail.com>
Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20250220072940.99994-7-kerneljasonxing@gmail.com
parent aa290f93
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -489,10 +489,14 @@ enum {

	/* generate software time stamp when entering packet scheduling */
	SKBTX_SCHED_TSTAMP = 1 << 6,

	/* used for bpf extension when a bpf program is loaded */
	SKBTX_BPF = 1 << 7,
};

#define SKBTX_ANY_SW_TSTAMP	(SKBTX_SW_TSTAMP    | \
				 SKBTX_SCHED_TSTAMP)
				 SKBTX_SCHED_TSTAMP | \
				 SKBTX_BPF)
#define SKBTX_ANY_TSTAMP	(SKBTX_HW_TSTAMP | \
				 SKBTX_HW_TSTAMP_USE_CYCLES | \
				 SKBTX_ANY_SW_TSTAMP)
+5 −0
Original line number Diff line number Diff line
@@ -7031,6 +7031,11 @@ enum {
					 * by the kernel or the
					 * earlier bpf-progs.
					 */
	BPF_SOCK_OPS_TSTAMP_SCHED_CB,	/* Called when skb is passing
					 * through dev layer when
					 * SK_BPF_CB_TX_TIMESTAMPING
					 * feature is on.
					 */
};

/* List of TCP states. There is a build check in net/ipv4/tcp.c to detect
+2 −1
Original line number Diff line number Diff line
@@ -4501,7 +4501,8 @@ int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev)
	skb_reset_mac_header(skb);
	skb_assert_len(skb);

	if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP))
	if (unlikely(skb_shinfo(skb)->tx_flags &
		     (SKBTX_SCHED_TSTAMP | SKBTX_BPF)))
		__skb_tstamp_tx(skb, NULL, NULL, skb->sk, SCM_TSTAMP_SCHED);

	/* Disable soft irqs for various locks below. Also
+20 −0
Original line number Diff line number Diff line
@@ -5556,6 +5556,23 @@ static bool skb_tstamp_tx_report_so_timestamping(struct sk_buff *skb,
	return false;
}

static void skb_tstamp_tx_report_bpf_timestamping(struct sk_buff *skb,
						  struct sock *sk,
						  int tstype)
{
	int op;

	switch (tstype) {
	case SCM_TSTAMP_SCHED:
		op = BPF_SOCK_OPS_TSTAMP_SCHED_CB;
		break;
	default:
		return;
	}

	bpf_skops_tx_timestamping(sk, skb, op);
}

void __skb_tstamp_tx(struct sk_buff *orig_skb,
		     const struct sk_buff *ack_skb,
		     struct skb_shared_hwtstamps *hwtstamps,
@@ -5568,6 +5585,9 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb,
	if (!sk)
		return;

	if (skb_shinfo(orig_skb)->tx_flags & SKBTX_BPF)
		skb_tstamp_tx_report_bpf_timestamping(orig_skb, sk, tstype);

	if (!skb_tstamp_tx_report_so_timestamping(orig_skb, hwtstamps, tstype))
		return;

+5 −0
Original line number Diff line number Diff line
@@ -7031,6 +7031,11 @@ enum {
					 * by the kernel or the
					 * earlier bpf-progs.
					 */
	BPF_SOCK_OPS_TSTAMP_SCHED_CB,	/* Called when skb is passing
					 * through dev layer when
					 * SK_BPF_CB_TX_TIMESTAMPING
					 * feature is on.
					 */
};

/* List of TCP states. There is a build check in net/ipv4/tcp.c to detect