mirror of
https://github.com/torvalds/linux.git
synced 2025-04-12 06:49:52 +00: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
@ -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…
x
Reference in New Issue
Block a user