mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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