[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <ZVYzasQqh18fo8Kr@boxer>
Date: Thu, 16 Nov 2023 16:21:14 +0100
From: Maciej Fijalkowski <maciej.fijalkowski@...el.com>
To: Larysa Zaremba <larysa.zaremba@...el.com>
CC: <bpf@...r.kernel.org>, <ast@...nel.org>, <daniel@...earbox.net>,
<andrii@...nel.org>, <martin.lau@...ux.dev>, <song@...nel.org>, <yhs@...com>,
<john.fastabend@...il.com>, <kpsingh@...nel.org>, <sdf@...gle.com>,
<haoluo@...gle.com>, <jolsa@...nel.org>, David Ahern <dsahern@...il.com>,
Jakub Kicinski <kuba@...nel.org>, Willem de Bruijn <willemb@...gle.com>,
Jesper Dangaard Brouer <hawk@...nel.org>, Anatoly Burakov
<anatoly.burakov@...el.com>, Alexander Lobakin <alexandr.lobakin@...el.com>,
Magnus Karlsson <magnus.karlsson@...il.com>, Maryam Tahhan
<mtahhan@...hat.com>, <xdp-hints@...-project.net>, <netdev@...r.kernel.org>,
Willem de Bruijn <willemdebruijn.kernel@...il.com>, Alexei Starovoitov
<alexei.starovoitov@...il.com>, Tariq Toukan <tariqt@...lanox.com>, "Saeed
Mahameed" <saeedm@...lanox.com>
Subject: Re: [PATCH bpf-next v7 05/18] ice: Support HW timestamp hint
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@...el.com>
Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@...el.com>
> ---
> 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
>
Powered by blists - more mailing lists