All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
To: Alexander Lobakin <aleksander.lobakin@intel.com>
Cc: "David S. Miller" <davem@davemloft.net>,
	"Eric Dumazet" <edumazet@google.com>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Paolo Abeni" <pabeni@redhat.com>,
	"Toke Høiland-Jørgensen" <toke@redhat.com>,
	"Alexei Starovoitov" <ast@kernel.org>,
	"Daniel Borkmann" <daniel@iogearbox.net>,
	"John Fastabend" <john.fastabend@gmail.com>,
	"Andrii Nakryiko" <andrii@kernel.org>,
	"Stanislav Fomichev" <sdf@fomichev.me>,
	"Magnus Karlsson" <magnus.karlsson@intel.com>,
	nex.sw.ncis.osdt.itp.upstreaming@intel.com, bpf@vger.kernel.org,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH net-next v2 14/18] xsk: make xsk_buff_add_frag really add a frag via __xdp_buff_add_frag()
Date: Thu, 17 Oct 2024 15:04:25 +0200	[thread overview]
Message-ID: <ZxELWQeV7uBVN6YP@boxer> (raw)
In-Reply-To: <20241015145350.4077765-15-aleksander.lobakin@intel.com>

On Tue, Oct 15, 2024 at 04:53:46PM +0200, Alexander Lobakin wrote:
> Currently, xsk_buff_add_frag() only adds a frag to the pool linked list,
> not doing anything with the &xdp_buff. The drivers do that manually and
> the logic is the same.
> Make it really add an skb frag, just like xdp_buff_add_frag() does that,
> and freeing frags on error if needed. This allows to remove repeating
> code from i40e and ice and not add the same code again and again.
> 
> Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>

Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>

Me gusta.

> ---
>  include/net/xdp_sock_drv.h                 | 18 ++++++++++--
>  drivers/net/ethernet/intel/i40e/i40e_xsk.c | 30 ++------------------
>  drivers/net/ethernet/intel/ice/ice_xsk.c   | 32 ++--------------------
>  3 files changed, 20 insertions(+), 60 deletions(-)
> 
> diff --git a/include/net/xdp_sock_drv.h b/include/net/xdp_sock_drv.h
> index f3175a5d28f7..6aae95b83645 100644
> --- a/include/net/xdp_sock_drv.h
> +++ b/include/net/xdp_sock_drv.h
> @@ -136,11 +136,21 @@ static inline void xsk_buff_free(struct xdp_buff *xdp)
>  	xp_free(xskb);
>  }
>  
> -static inline void xsk_buff_add_frag(struct xdp_buff *xdp)
> +static inline bool xsk_buff_add_frag(struct xdp_buff *head,
> +				     struct xdp_buff *xdp)
>  {
> -	struct xdp_buff_xsk *frag = container_of(xdp, struct xdp_buff_xsk, xdp);
> +	const void *data = xdp->data;
> +	struct xdp_buff_xsk *frag;
> +
> +	if (!__xdp_buff_add_frag(head, virt_to_page(data),
> +				 offset_in_page(data), xdp->data_end - data,
> +				 xdp->frame_sz, false))
> +		return false;
>  
> +	frag = container_of(xdp, struct xdp_buff_xsk, xdp);
>  	list_add_tail(&frag->list_node, &frag->pool->xskb_list);
> +
> +	return true;
>  }
>  
>  static inline struct xdp_buff *xsk_buff_get_frag(const struct xdp_buff *first)
> @@ -357,8 +367,10 @@ static inline void xsk_buff_free(struct xdp_buff *xdp)
>  {
>  }
>  
> -static inline void xsk_buff_add_frag(struct xdp_buff *xdp)
> +static inline bool xsk_buff_add_frag(struct xdp_buff *head,
> +				     struct xdp_buff *xdp)
>  {
> +	return false;
>  }
>  
>  static inline struct xdp_buff *xsk_buff_get_frag(const struct xdp_buff *first)
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> index 4e885df789ef..e28f1905a4a0 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> @@ -395,32 +395,6 @@ static void i40e_handle_xdp_result_zc(struct i40e_ring *rx_ring,
>  	WARN_ON_ONCE(1);
>  }
>  
> -static int
> -i40e_add_xsk_frag(struct i40e_ring *rx_ring, struct xdp_buff *first,
> -		  struct xdp_buff *xdp, const unsigned int size)
> -{
> -	struct skb_shared_info *sinfo = xdp_get_shared_info_from_buff(first);
> -
> -	if (!xdp_buff_has_frags(first)) {
> -		sinfo->nr_frags = 0;
> -		sinfo->xdp_frags_size = 0;
> -		xdp_buff_set_frags_flag(first);
> -	}
> -
> -	if (unlikely(sinfo->nr_frags == MAX_SKB_FRAGS)) {
> -		xsk_buff_free(first);
> -		return -ENOMEM;
> -	}
> -
> -	__skb_fill_page_desc_noacc(sinfo, sinfo->nr_frags++,
> -				   virt_to_page(xdp->data_hard_start),
> -				   XDP_PACKET_HEADROOM, size);
> -	sinfo->xdp_frags_size += size;
> -	xsk_buff_add_frag(xdp);
> -
> -	return 0;
> -}
> -
>  /**
>   * i40e_clean_rx_irq_zc - Consumes Rx packets from the hardware ring
>   * @rx_ring: Rx ring
> @@ -486,8 +460,10 @@ int i40e_clean_rx_irq_zc(struct i40e_ring *rx_ring, int budget)
>  
>  		if (!first)
>  			first = bi;
> -		else if (i40e_add_xsk_frag(rx_ring, first, bi, size))
> +		else if (!xsk_buff_add_frag(first, bi)) {
> +			xsk_buff_free(first);
>  			break;
> +		}
>  
>  		if (++next_to_process == count)
>  			next_to_process = 0;
> diff --git a/drivers/net/ethernet/intel/ice/ice_xsk.c b/drivers/net/ethernet/intel/ice/ice_xsk.c
> index 334ae945d640..8975d2971bc3 100644
> --- a/drivers/net/ethernet/intel/ice/ice_xsk.c
> +++ b/drivers/net/ethernet/intel/ice/ice_xsk.c
> @@ -801,35 +801,6 @@ ice_run_xdp_zc(struct ice_rx_ring *rx_ring, struct xdp_buff *xdp,
>  	return result;
>  }
>  
> -static int
> -ice_add_xsk_frag(struct ice_rx_ring *rx_ring, struct xdp_buff *first,
> -		 struct xdp_buff *xdp, const unsigned int size)
> -{
> -	struct skb_shared_info *sinfo = xdp_get_shared_info_from_buff(first);
> -
> -	if (!size)
> -		return 0;
> -
> -	if (!xdp_buff_has_frags(first)) {
> -		sinfo->nr_frags = 0;
> -		sinfo->xdp_frags_size = 0;
> -		xdp_buff_set_frags_flag(first);
> -	}
> -
> -	if (unlikely(sinfo->nr_frags == MAX_SKB_FRAGS)) {
> -		xsk_buff_free(first);
> -		return -ENOMEM;
> -	}
> -
> -	__skb_fill_page_desc_noacc(sinfo, sinfo->nr_frags++,
> -				   virt_to_page(xdp->data_hard_start),
> -				   XDP_PACKET_HEADROOM, size);
> -	sinfo->xdp_frags_size += size;
> -	xsk_buff_add_frag(xdp);
> -
> -	return 0;
> -}
> -
>  /**
>   * ice_clean_rx_irq_zc - consumes packets from the hardware ring
>   * @rx_ring: AF_XDP Rx ring
> @@ -895,7 +866,8 @@ int ice_clean_rx_irq_zc(struct ice_rx_ring *rx_ring,
>  
>  		if (!first) {
>  			first = xdp;
> -		} else if (ice_add_xsk_frag(rx_ring, first, xdp, size)) {
> +		} else if (likely(size) && !xsk_buff_add_frag(first, xdp)) {
> +			xsk_buff_free(first);
>  			break;
>  		}
>  
> -- 
> 2.46.2
> 

  reply	other threads:[~2024-10-17 13:05 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-15 14:53 [PATCH net-next v2 00/18] idpf: XDP chapter III: core XDP changes (+libeth_xdp) Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 01/18] jump_label: export static_key_slow_{inc,dec}_cpuslocked() Alexander Lobakin
2024-10-17 11:06   ` Maciej Fijalkowski
2024-10-21 13:53     ` Alexander Lobakin
2024-10-22 12:52       ` Maciej Fijalkowski
2024-10-15 14:53 ` [PATCH net-next v2 02/18] skbuff: allow 2-4-argument skb_frag_dma_map() Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 03/18] unroll: add generic loop unroll helpers Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 04/18] bpf, xdp: constify some bpf_prog * function arguments Alexander Lobakin
2024-10-17 11:12   ` Maciej Fijalkowski
2024-10-21 13:56     ` Alexander Lobakin
2024-10-22 12:55       ` Maciej Fijalkowski
2024-10-15 14:53 ` [PATCH net-next v2 05/18] xdp, xsk: constify read-only arguments of some static inline helpers Alexander Lobakin
2024-10-17 11:14   ` Maciej Fijalkowski
2024-10-21 13:57     ` Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 06/18] xdp: allow attaching already registered memory model to xdp_rxq_info Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 07/18] net: Register system page pool as an XDP memory model Alexander Lobakin
2024-10-17 11:32   ` Maciej Fijalkowski
2024-10-21 14:00     ` Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 08/18] page_pool: make page_pool_put_page_bulk() actually handle array of pages Alexander Lobakin
2024-10-17 11:33   ` Maciej Fijalkowski
2024-10-21 14:03     ` Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 09/18] page_pool: allow mixing PPs within one bulk Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 10/18] xdp: get rid of xdp_frame::mem.id Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 11/18] xdp: add generic xdp_buff_add_frag() Alexander Lobakin
2024-10-17 12:26   ` Maciej Fijalkowski
2024-10-21 14:10     ` Alexander Lobakin
2024-10-22 13:00       ` Maciej Fijalkowski
2024-10-15 14:53 ` [PATCH net-next v2 12/18] xdp: add generic xdp_build_skb_from_buff() Alexander Lobakin
2024-10-17 12:34   ` Maciej Fijalkowski
2024-10-21 14:20     ` Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 13/18] xsk: allow attaching XSk pool via xdp_rxq_info_reg_mem_model() Alexander Lobakin
2024-10-17 12:49   ` Maciej Fijalkowski
2024-10-21 14:23     ` Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 14/18] xsk: make xsk_buff_add_frag really add a frag via __xdp_buff_add_frag() Alexander Lobakin
2024-10-17 13:04   ` Maciej Fijalkowski [this message]
2024-10-15 14:53 ` [PATCH net-next v2 15/18] xsk: add generic XSk &xdp_buff -> skb conversion Alexander Lobakin
2024-10-18 12:48   ` Maciej Fijalkowski
2024-10-15 14:53 ` [PATCH net-next v2 16/18] xsk: add helper to get &xdp_desc's DMA and meta pointer in one go Alexander Lobakin
2024-10-22 15:42   ` Maciej Fijalkowski
2024-10-23 14:50     ` Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 17/18] libeth: support native XDP and register memory model Alexander Lobakin
2024-10-15 14:53 ` [PATCH net-next v2 18/18] libeth: add a couple of XDP helpers (libeth_xdp) Alexander Lobakin

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

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

  git send-email \
    --in-reply-to=ZxELWQeV7uBVN6YP@boxer \
    --to=maciej.fijalkowski@intel.com \
    --cc=aleksander.lobakin@intel.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=john.fastabend@gmail.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=magnus.karlsson@intel.com \
    --cc=netdev@vger.kernel.org \
    --cc=nex.sw.ncis.osdt.itp.upstreaming@intel.com \
    --cc=pabeni@redhat.com \
    --cc=sdf@fomichev.me \
    --cc=toke@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.