From: Mina Almasry <[email protected]> Date: Thu, 18 Dec 2025 02:29:36 +0000
> From: YiFei Zhu <[email protected]> > > The logic is similar to idpf_rx_hwtstamp, but the data is exported > as a BPF kfunc instead of appended to an skb. > > A idpf_queue_has(PTP, rxq) condition is added to check the queue > supports PTP similar to idpf_rx_process_skb_fields. Much better now, one nit below. > > Cc: [email protected] > > Signed-off-by: YiFei Zhu <[email protected]> > Signed-off-by: Mina Almasry <[email protected]> > Reviewed-by: Aleksandr Loktionov <[email protected]> > > --- > > v2: > https://lore.kernel.org/netdev/[email protected]/ > - Fixed alphabetical ordering > - Use the xdp desc type instead of virtchnl one (required some added > helpers) > > --- > drivers/net/ethernet/intel/idpf/xdp.c | 29 +++++++++++++++++++++++++++ > drivers/net/ethernet/intel/idpf/xdp.h | 17 ++++++++++++++++ > 2 files changed, 46 insertions(+) > > diff --git a/drivers/net/ethernet/intel/idpf/xdp.c > b/drivers/net/ethernet/intel/idpf/xdp.c > index 958d16f87424..7744d6898f74 100644 > --- a/drivers/net/ethernet/intel/idpf/xdp.c > +++ b/drivers/net/ethernet/intel/idpf/xdp.c > @@ -2,6 +2,7 @@ > /* Copyright (C) 2025 Intel Corporation */ > > #include "idpf.h" > +#include "idpf_ptp.h" > #include "idpf_virtchnl.h" > #include "xdp.h" > #include "xsk.h" > @@ -391,8 +392,36 @@ static int idpf_xdpmo_rx_hash(const struct xdp_md *ctx, > u32 *hash, > pt); > } > > +static int idpf_xdpmo_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) > +{ > + const struct libeth_xdp_buff *xdp = (typeof(xdp))ctx; > + struct idpf_xdp_rx_desc desc __uninitialized; > + const struct idpf_rx_queue *rxq; > + u64 cached_time, ts_ns; > + u32 ts_high; > + > + idpf_xdp_get_qw1(&desc, xdp->desc); > + rxq = libeth_xdp_buff_to_rq(xdp, typeof(*rxq), xdp_rxq); > + > + if (!idpf_queue_has(PTP, rxq)) > + return -ENODATA; I think this could be optimized a little bit by reodering, rxq = libeth_xdp_buff_to_rq(xdp, typeof(*rxq), xdp_rxq); if (!idpf_queue_has(PTP, rxq)) return -ENODATA; idpf_xdp_get_qw1(&desc, xdp->desc); to not read the desc if the Rx queue doesn't have the PTP bit set. Apart from this, LGTM. > + if (!(idpf_xdp_rx_ts_low(&desc) & VIRTCHNL2_RX_FLEX_TSTAMP_VALID)) > + return -ENODATA; > + > + cached_time = READ_ONCE(rxq->cached_phc_time); > + > + idpf_xdp_get_qw3(&desc, xdp->desc); > + > + ts_high = idpf_xdp_rx_ts_high(&desc); > + ts_ns = idpf_ptp_tstamp_extend_32b_to_64b(cached_time, ts_high); > + > + *timestamp = ts_ns; > + return 0; > +} > + > static const struct xdp_metadata_ops idpf_xdpmo = { > .xmo_rx_hash = idpf_xdpmo_rx_hash, > + .xmo_rx_timestamp = idpf_xdpmo_rx_timestamp, > }; Thanks, Olek
