mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +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
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…
Add table
Reference in a new issue