On Wed, Nov 15, 2023 at 06:52:47PM +0100, Larysa Zaremba wrote: > Use previously refactored code and create a function > that allows XDP code to read HW timestamp. > > Also, introduce packet context, where hints-related data will be stored. > ice_xdp_buff contains only a pointer to this structure, to avoid copying it > in ZC mode later in the series. > > HW timestamp is the first supported hint in the driver, > so also add xdp_metadata_ops. > > Signed-off-by: Larysa Zaremba <larysa.zaremba@xxxxxxxxx> Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@xxxxxxxxx> > --- > drivers/net/ethernet/intel/ice/ice.h | 2 ++ > drivers/net/ethernet/intel/ice/ice_base.c | 1 + > drivers/net/ethernet/intel/ice/ice_main.c | 1 + > drivers/net/ethernet/intel/ice/ice_ptp.c | 6 ++--- > drivers/net/ethernet/intel/ice/ice_ptp.h | 4 +-- > drivers/net/ethernet/intel/ice/ice_txrx.h | 10 +++++++- > drivers/net/ethernet/intel/ice/ice_txrx_lib.c | 25 ++++++++++++++++++- > 7 files changed, 42 insertions(+), 7 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h > index 351e0d36df44..366c82a87e56 100644 > --- a/drivers/net/ethernet/intel/ice/ice.h > +++ b/drivers/net/ethernet/intel/ice/ice.h > @@ -989,4 +989,6 @@ static inline void ice_clear_rdma_cap(struct ice_pf *pf) > set_bit(ICE_FLAG_UNPLUG_AUX_DEV, pf->flags); > clear_bit(ICE_FLAG_RDMA_ENA, pf->flags); > } > + > +extern const struct xdp_metadata_ops ice_xdp_md_ops; > #endif /* _ICE_H_ */ > diff --git a/drivers/net/ethernet/intel/ice/ice_base.c b/drivers/net/ethernet/intel/ice/ice_base.c > index 7fa43827a3f0..2d83f3c029e7 100644 > --- a/drivers/net/ethernet/intel/ice/ice_base.c > +++ b/drivers/net/ethernet/intel/ice/ice_base.c > @@ -575,6 +575,7 @@ int ice_vsi_cfg_rxq(struct ice_rx_ring *ring) > > xdp_init_buff(&ring->xdp, ice_rx_pg_size(ring) / 2, &ring->xdp_rxq); > ring->xdp.data = NULL; > + ring->xdp_ext.pkt_ctx = &ring->pkt_ctx; > err = ice_setup_rx_ctx(ring); > if (err) { > dev_err(dev, "ice_setup_rx_ctx failed for RxQ %d, err %d\n", > diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c > index 6607fa6fe556..cfb6beadcc60 100644 > --- a/drivers/net/ethernet/intel/ice/ice_main.c > +++ b/drivers/net/ethernet/intel/ice/ice_main.c > @@ -3397,6 +3397,7 @@ static void ice_set_ops(struct ice_vsi *vsi) > > netdev->netdev_ops = &ice_netdev_ops; > netdev->udp_tunnel_nic_info = &pf->hw.udp_tunnel_nic; > + netdev->xdp_metadata_ops = &ice_xdp_md_ops; > ice_set_ethtool_ops(netdev); > > if (vsi->type != ICE_VSI_PF) > diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c > index a435f89b262f..667264c8dc8b 100644 > --- a/drivers/net/ethernet/intel/ice/ice_ptp.c > +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c > @@ -2105,12 +2105,12 @@ int ice_ptp_set_ts_config(struct ice_pf *pf, struct ifreq *ifr) > /** > * ice_ptp_get_rx_hwts - Get packet Rx timestamp in ns > * @rx_desc: Receive descriptor > - * @rx_ring: Ring to get the cached time > + * @pkt_ctx: Packet context to get the cached time > * > * The driver receives a notification in the receive descriptor with timestamp. > */ > u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc, > - struct ice_rx_ring *rx_ring) > + const struct ice_pkt_ctx *pkt_ctx) > { > u64 ts_ns, cached_time; > u32 ts_high; > @@ -2118,7 +2118,7 @@ u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc, > if (!(rx_desc->wb.time_stamp_low & ICE_PTP_TS_VALID)) > return 0; > > - cached_time = READ_ONCE(rx_ring->cached_phctime); > + cached_time = READ_ONCE(pkt_ctx->cached_phctime); > > /* Do not report a timestamp if we don't have a cached PHC time */ > if (!cached_time) > diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h > index 0274da964fe3..30b382ed204d 100644 > --- a/drivers/net/ethernet/intel/ice/ice_ptp.h > +++ b/drivers/net/ethernet/intel/ice/ice_ptp.h > @@ -299,7 +299,7 @@ s8 ice_ptp_request_ts(struct ice_ptp_tx *tx, struct sk_buff *skb); > enum ice_tx_tstamp_work ice_ptp_process_ts(struct ice_pf *pf); > > u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc, > - struct ice_rx_ring *rx_ring); > + const struct ice_pkt_ctx *pkt_ctx); > void ice_ptp_reset(struct ice_pf *pf); > void ice_ptp_prepare_for_reset(struct ice_pf *pf); > void ice_ptp_init(struct ice_pf *pf); > @@ -332,7 +332,7 @@ static inline bool ice_ptp_process_ts(struct ice_pf *pf) > > static inline u64 > ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc, > - struct ice_rx_ring *rx_ring) > + const struct ice_pkt_ctx *pkt_ctx) > { > return 0; > } > diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.h b/drivers/net/ethernet/intel/ice/ice_txrx.h > index 9efb42f99415..3d77c058c6de 100644 > --- a/drivers/net/ethernet/intel/ice/ice_txrx.h > +++ b/drivers/net/ethernet/intel/ice/ice_txrx.h > @@ -257,9 +257,14 @@ enum ice_rx_dtype { > ICE_RX_DTYPE_SPLIT_ALWAYS = 2, > }; > > +struct ice_pkt_ctx { > + u64 cached_phctime; > +}; > + > struct ice_xdp_buff { > struct xdp_buff xdp_buff; > const union ice_32b_rx_flex_desc *eop_desc; > + const struct ice_pkt_ctx *pkt_ctx; > }; > > /* Required for compatibility with xdp_buffs from xsk_pool */ > @@ -328,6 +333,10 @@ struct ice_rx_ring { > struct xdp_buff xdp; > }; > /* CL3 - 3rd cacheline starts here */ > + union { > + struct ice_pkt_ctx pkt_ctx; > + u64 cached_phctime; > + }; > struct bpf_prog *xdp_prog; > u16 rx_offset; > > @@ -346,7 +355,6 @@ struct ice_rx_ring { > struct ice_rx_ring *next; /* pointer to next ring in q_vector */ > struct xsk_buff_pool *xsk_pool; > dma_addr_t dma; /* physical address of ring */ > - u64 cached_phctime; > u16 rx_buf_len; > u8 dcb_tc; /* Traffic class of ring */ > u8 ptp_rx; > diff --git a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c > index 1fc1794b8e80..d57019b85641 100644 > --- a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c > +++ b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c > @@ -197,7 +197,7 @@ ice_ptp_rx_hwts_to_skb(struct ice_rx_ring *rx_ring, > const union ice_32b_rx_flex_desc *rx_desc, > struct sk_buff *skb) > { > - u64 ts_ns = ice_ptp_get_rx_hwts(rx_desc, rx_ring); > + u64 ts_ns = ice_ptp_get_rx_hwts(rx_desc, &rx_ring->pkt_ctx); > > *skb_hwtstamps(skb) = (struct skb_shared_hwtstamps){ > .hwtstamp = ns_to_ktime(ts_ns), > @@ -509,3 +509,26 @@ void ice_finalize_xdp_rx(struct ice_tx_ring *xdp_ring, unsigned int xdp_res, > spin_unlock(&xdp_ring->tx_lock); > } > } > + > +/** > + * ice_xdp_rx_hw_ts - HW timestamp XDP hint handler > + * @ctx: XDP buff pointer > + * @ts_ns: destination address > + * > + * Copy HW timestamp (if available) to the destination address. > + */ > +static int ice_xdp_rx_hw_ts(const struct xdp_md *ctx, u64 *ts_ns) > +{ > + const struct ice_xdp_buff *xdp_ext = (void *)ctx; > + > + *ts_ns = ice_ptp_get_rx_hwts(xdp_ext->eop_desc, > + xdp_ext->pkt_ctx); > + if (!*ts_ns) > + return -ENODATA; > + > + return 0; > +} > + > +const struct xdp_metadata_ops ice_xdp_md_ops = { > + .xmo_rx_timestamp = ice_xdp_rx_hw_ts, > +}; > -- > 2.41.0 >