forked from mirrors/linux
		
	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: 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-7-kerneljasonxing@gmail.com
This commit is contained in:
		
							parent
							
								
									aa290f93a4
								
							
						
					
					
						commit
						6b98ec7e88
					
				
					 5 changed files with 37 additions and 2 deletions
				
			
		|  | @ -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) | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Jason Xing
						Jason Xing