XDP hardware hints discussion mail archive
 help / color / mirror / Atom feed
From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
To: Larysa Zaremba <larysa.zaremba@intel.com>
Cc: bpf@vger.kernel.org, ast@kernel.org, daniel@iogearbox.net,
	andrii@kernel.org, martin.lau@linux.dev, song@kernel.org,
	yhs@fb.com, john.fastabend@gmail.com, kpsingh@kernel.org,
	sdf@google.com, haoluo@google.com, jolsa@kernel.org,
	David Ahern <dsahern@gmail.com>, Jakub Kicinski <kuba@kernel.org>,
	Willem de Bruijn <willemb@google.com>,
	Jesper Dangaard Brouer <hawk@kernel.org>,
	Anatoly Burakov <anatoly.burakov@intel.com>,
	Alexander Lobakin <alexandr.lobakin@intel.com>,
	Magnus Karlsson <magnus.karlsson@gmail.com>,
	Maryam Tahhan <mtahhan@redhat.com>,
	xdp-hints@xdp-project.net, netdev@vger.kernel.org,
	Willem de Bruijn <willemdebruijn.kernel@gmail.com>,
	Alexei Starovoitov <alexei.starovoitov@gmail.com>,
	Tariq Toukan <tariqt@mellanox.com>,
	Saeed Mahameed <saeedm@mellanox.com>
Subject: [xdp-hints] Re: [PATCH bpf-next v7 05/18] ice: Support HW timestamp hint
Date: Thu, 16 Nov 2023 16:21:14 +0100	[thread overview]
Message-ID: <ZVYzasQqh18fo8Kr@boxer> (raw)
In-Reply-To: <20231115175301.534113-6-larysa.zaremba@intel.com>

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@intel.com>

Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.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
> 

  reply	other threads:[~2023-11-16 15:21 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-15 17:52 [xdp-hints] [PATCH bpf-next v7 00/18] XDP metadata via kfuncs for ice + VLAN hint Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 01/18] ice: make RX hash reading code more reusable Larysa Zaremba
2023-11-16 15:04   ` [xdp-hints] " Maciej Fijalkowski
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 02/18] ice: make RX HW timestamp " Larysa Zaremba
2023-11-16 15:19   ` [xdp-hints] " Maciej Fijalkowski
2023-11-17 14:26     ` Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 03/18] ice: Make ptype internal to descriptor info processing Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 04/18] ice: Introduce ice_xdp_buff Larysa Zaremba
2023-11-16 12:52   ` [xdp-hints] " Maciej Fijalkowski
2023-11-16  2:55     ` Larysa Zaremba
2023-12-01 13:51       ` Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 05/18] ice: Support HW timestamp hint Larysa Zaremba
2023-11-16 15:21   ` Maciej Fijalkowski [this message]
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 06/18] ice: Support RX hash XDP hint Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 07/18] xsk: add functions to fill control buffer Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 08/18] ice: Support XDP hints in AF_XDP ZC mode Larysa Zaremba
2023-11-16 12:49   ` [xdp-hints] " Maciej Fijalkowski
2023-11-16  3:01     ` Larysa Zaremba
2023-11-16 15:01       ` Maciej Fijalkowski
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 09/18] xdp: Add VLAN tag hint Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 10/18] ice: Implement " Larysa Zaremba
2023-11-16 15:47   ` [xdp-hints] " Maciej Fijalkowski
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 11/18] ice: use VLAN proto from ring packet context in skb path Larysa Zaremba
2023-11-17  8:10   ` [xdp-hints] " Maciej Fijalkowski
2023-11-17 14:07     ` Larysa Zaremba
2023-11-17 15:14       ` Maciej Fijalkowski
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 12/18] veth: Implement VLAN tag XDP hint Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 13/18] net: make vlan_get_tag() return -ENODATA instead of -EINVAL Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 14/18] mlx5: implement VLAN tag XDP hint Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 15/18] selftests/bpf: Allow VLAN packets in xdp_hw_metadata Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 16/18] selftests/bpf: Add flags and VLAN hint to xdp_hw_metadata Larysa Zaremba
2023-11-15 17:52 ` [xdp-hints] [PATCH bpf-next v7 17/18] selftests/bpf: Use AF_INET for TX in xdp_metadata Larysa Zaremba
2023-11-20 21:15   ` [xdp-hints] " Stanislav Fomichev
     [not found]   ` <170051500599.3770946.2674696540245347885@gauss.local>
2023-11-21  9:02     ` Larysa Zaremba
2023-11-15 17:53 ` [xdp-hints] [PATCH bpf-next v7 18/18] selftests/bpf: Check VLAN tag and proto " Larysa Zaremba

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://lists.xdp-project.net/postorius/lists/xdp-hints.xdp-project.net/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZVYzasQqh18fo8Kr@boxer \
    --to=maciej.fijalkowski@intel.com \
    --cc=alexandr.lobakin@intel.com \
    --cc=alexei.starovoitov@gmail.com \
    --cc=anatoly.burakov@intel.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=dsahern@gmail.com \
    --cc=haoluo@google.com \
    --cc=hawk@kernel.org \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=kpsingh@kernel.org \
    --cc=kuba@kernel.org \
    --cc=larysa.zaremba@intel.com \
    --cc=magnus.karlsson@gmail.com \
    --cc=martin.lau@linux.dev \
    --cc=mtahhan@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=saeedm@mellanox.com \
    --cc=sdf@google.com \
    --cc=song@kernel.org \
    --cc=tariqt@mellanox.com \
    --cc=willemb@google.com \
    --cc=willemdebruijn.kernel@gmail.com \
    --cc=xdp-hints@xdp-project.net \
    --cc=yhs@fb.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox