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 */ | 	/* generate software time stamp when entering packet scheduling */ | ||||||
| 	SKBTX_SCHED_TSTAMP = 1 << 6, | 	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    | \ | #define SKBTX_ANY_SW_TSTAMP	(SKBTX_SW_TSTAMP    | \ | ||||||
| 				 SKBTX_SCHED_TSTAMP) | 				 SKBTX_SCHED_TSTAMP | \ | ||||||
|  | 				 SKBTX_BPF) | ||||||
| #define SKBTX_ANY_TSTAMP	(SKBTX_HW_TSTAMP | \ | #define SKBTX_ANY_TSTAMP	(SKBTX_HW_TSTAMP | \ | ||||||
| 				 SKBTX_HW_TSTAMP_USE_CYCLES | \ | 				 SKBTX_HW_TSTAMP_USE_CYCLES | \ | ||||||
| 				 SKBTX_ANY_SW_TSTAMP) | 				 SKBTX_ANY_SW_TSTAMP) | ||||||
|  |  | ||||||
|  | @ -7031,6 +7031,11 @@ enum { | ||||||
| 					 * by the kernel or the | 					 * by the kernel or the | ||||||
| 					 * earlier bpf-progs. | 					 * 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
 | /* 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_reset_mac_header(skb); | ||||||
| 	skb_assert_len(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); | 		__skb_tstamp_tx(skb, NULL, NULL, skb->sk, SCM_TSTAMP_SCHED); | ||||||
| 
 | 
 | ||||||
| 	/* Disable soft irqs for various locks below. Also
 | 	/* 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; | 	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, | void __skb_tstamp_tx(struct sk_buff *orig_skb, | ||||||
| 		     const struct sk_buff *ack_skb, | 		     const struct sk_buff *ack_skb, | ||||||
| 		     struct skb_shared_hwtstamps *hwtstamps, | 		     struct skb_shared_hwtstamps *hwtstamps, | ||||||
|  | @ -5568,6 +5585,9 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, | ||||||
| 	if (!sk) | 	if (!sk) | ||||||
| 		return; | 		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)) | 	if (!skb_tstamp_tx_report_so_timestamping(orig_skb, hwtstamps, tstype)) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -7031,6 +7031,11 @@ enum { | ||||||
| 					 * by the kernel or the | 					 * by the kernel or the | ||||||
| 					 * earlier bpf-progs. | 					 * 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
 | /* 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