On Wed, Feb 5, 2025 at 11:34 PM Willem de Bruijn <willemdebruijn.kernel@xxxxxxxxx> wrote: > > Jason Xing wrote: > > No functional changes here, only add skb_enable_app_tstamp() to test > > if the orig_skb matches the usage of application SO_TIMESTAMPING > > or its bpf extension. And it's good to support two modes in > > parallel later in this series. > > > > Also, this patch deliberately distinguish the software and > > hardware SCM_TSTAMP_SND timestamp by passing 'sw' parameter in order > > to avoid such a case where hardware may go wrong and pass a NULL > > hwstamps, which is even though unlikely to happen. If it really > > happens, bpf prog will finally consider it as a software timestamp. > > It will be hardly recognized. Let's make the timestamping part > > more robust. > > Disagree. Don't add a crutch that has not shown to be necessary for > all this time. > > Just infer hw from hwtstamps != NULL. > > > Signed-off-by: Jason Xing <kerneljasonxing@xxxxxxxxx> > > --- > > include/linux/skbuff.h | 13 +++++++------ > > net/core/dev.c | 2 +- > > net/core/skbuff.c | 32 ++++++++++++++++++++++++++++++-- > > net/ipv4/tcp_input.c | 3 ++- > > 4 files changed, 40 insertions(+), 10 deletions(-) > > > > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > > index bb2b751d274a..dfc419281cc9 100644 > > --- a/include/linux/skbuff.h > > +++ b/include/linux/skbuff.h > > @@ -39,6 +39,7 @@ > > #include <net/net_debug.h> > > #include <net/dropreason-core.h> > > #include <net/netmem.h> > > +#include <uapi/linux/errqueue.h> > > > > /** > > * DOC: skb checksums > > @@ -4533,18 +4534,18 @@ void skb_complete_tx_timestamp(struct sk_buff *skb, > > > > void __skb_tstamp_tx(struct sk_buff *orig_skb, const struct sk_buff *ack_skb, > > struct skb_shared_hwtstamps *hwtstamps, > > - struct sock *sk, int tstype); > > + struct sock *sk, bool sw, int tstype); > > > > /** > > - * skb_tstamp_tx - queue clone of skb with send time stamps > > + * skb_tstamp_tx - queue clone of skb with send HARDWARE timestamps > > Unfortunately this cannot be modified to skb_tstamp_tx_hw, as that > would require updating way too many callers. > > > * @orig_skb: the original outgoing packet > > * @hwtstamps: hardware time stamps, may be NULL if not available > > * > > * If the skb has a socket associated, then this function clones the > > * skb (thus sharing the actual data and optional structures), stores > > - * the optional hardware time stamping information (if non NULL) or > > - * generates a software time stamp (otherwise), then queues the clone > > - * to the error queue of the socket. Errors are silently ignored. > > + * the optional hardware time stamping information (if non NULL) then > > + * queues the clone to the error queue of the socket. Errors are > > + * silently ignored. > > */ > > void skb_tstamp_tx(struct sk_buff *orig_skb, > > struct skb_shared_hwtstamps *hwtstamps); > > @@ -4565,7 +4566,7 @@ static inline void skb_tx_timestamp(struct sk_buff *skb) > > { > > skb_clone_tx_timestamp(skb); > > if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP) > > - skb_tstamp_tx(skb, NULL); > > + __skb_tstamp_tx(skb, NULL, NULL, skb->sk, true, SCM_TSTAMP_SND); > > If a separate version for software timestamps were needed, I'd suggest > adding a skb_tstamp_tx_sw() wrapper. But see first comment. > > > } > > > > /** > > diff --git a/net/core/dev.c b/net/core/dev.c > > index afa2282f2604..d77b8389753e 100644 > > --- a/net/core/dev.c > > +++ b/net/core/dev.c > > @@ -4501,7 +4501,7 @@ int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) > > skb_assert_len(skb); > > > > if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP)) > > - __skb_tstamp_tx(skb, NULL, NULL, skb->sk, SCM_TSTAMP_SCHED); > > + __skb_tstamp_tx(skb, NULL, NULL, skb->sk, true, SCM_TSTAMP_SCHED); > > > > /* Disable soft irqs for various locks below. Also > > * stops preemption for RCU. > > diff --git a/net/core/skbuff.c b/net/core/skbuff.c > > index a441613a1e6c..6042961dfc02 100644 > > --- a/net/core/skbuff.c > > +++ b/net/core/skbuff.c > > @@ -5539,10 +5539,35 @@ void skb_complete_tx_timestamp(struct sk_buff *skb, > > } > > EXPORT_SYMBOL_GPL(skb_complete_tx_timestamp); > > > > +static bool skb_enable_app_tstamp(struct sk_buff *skb, int tstype, bool sw) > > app is a bit vague. I suggest > > skb_tstamp_tx_report_so_timestamping > > and > > skb_tstamp_tx_report_bpf_timestamping Good name. I like them. > > > +{ > > + int flag; > > + > > + switch (tstype) { > > + case SCM_TSTAMP_SCHED: > > + flag = SKBTX_SCHED_TSTAMP; > > + break; > > Please just have a one line statements in the case directly: > > case SCM_TSTAMP_SCHED: > return skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP; > case SCM_TSTAMP_SND: > return skb_shinfo(skb)->tx_flags & (sw ? SKBTX_SW_TSTAMP : > SKBTX_HW_TSTAMP); > case SCM_TSTAMP_ACK: > return TCP_SKB_CB(skb)->txstamp_ack; > Thanks for the re-arrangement! > > + case SCM_TSTAMP_SND: > > + flag = sw ? SKBTX_SW_TSTAMP : SKBTX_HW_TSTAMP; > > + break; > > + case SCM_TSTAMP_ACK: > > + if (TCP_SKB_CB(skb)->txstamp_ack) > > + return true; > > + fallthrough; > > + default: > > + return false; > > + } > > + > > + if (skb_shinfo(skb)->tx_flags & flag) > > + return true; > > + > > + return false; > > +} > > + > > void __skb_tstamp_tx(struct sk_buff *orig_skb, > > const struct sk_buff *ack_skb, > > struct skb_shared_hwtstamps *hwtstamps, > > - struct sock *sk, int tstype) > > + struct sock *sk, bool sw, int tstype) > > { > > struct sk_buff *skb; > > bool tsonly, opt_stats = false; > > @@ -5551,6 +5576,9 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, > > if (!sk) > > return; > > > > + if (!skb_enable_app_tstamp(orig_skb, tstype, sw)) > > + return; > > + > > tsflags = READ_ONCE(sk->sk_tsflags); > > if (!hwtstamps && !(tsflags & SOF_TIMESTAMPING_OPT_TX_SWHW) && > > skb_shinfo(orig_skb)->tx_flags & SKBTX_IN_PROGRESS) > > @@ -5599,7 +5627,7 @@ EXPORT_SYMBOL_GPL(__skb_tstamp_tx); > > void skb_tstamp_tx(struct sk_buff *orig_skb, > > struct skb_shared_hwtstamps *hwtstamps) > > { > > - return __skb_tstamp_tx(orig_skb, NULL, hwtstamps, orig_skb->sk, > > + return __skb_tstamp_tx(orig_skb, NULL, hwtstamps, orig_skb->sk, false, > > SCM_TSTAMP_SND); > > } > > EXPORT_SYMBOL_GPL(skb_tstamp_tx); > > diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c > > index 77185479ed5e..62252702929d 100644 > > --- a/net/ipv4/tcp_input.c > > +++ b/net/ipv4/tcp_input.c > > @@ -3330,7 +3330,8 @@ static void tcp_ack_tstamp(struct sock *sk, struct sk_buff *skb, > > if (!before(shinfo->tskey, prior_snd_una) && > > before(shinfo->tskey, tcp_sk(sk)->snd_una)) { > > tcp_skb_tsorted_save(skb) { > > - __skb_tstamp_tx(skb, ack_skb, NULL, sk, SCM_TSTAMP_ACK); > > + __skb_tstamp_tx(skb, ack_skb, NULL, sk, true, > > + SCM_TSTAMP_ACK); > > } tcp_skb_tsorted_restore(skb); > > } > > } > > -- > > 2.43.5 > > > >