All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lorenzo Bianconi <lorenzo@kernel.org>
To: Vladimir Oltean <vladimir.oltean@nxp.com>
Cc: netdev@vger.kernel.org, claudiu.manoil@nxp.com,
	davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
	pabeni@redhat.com, lorenzo.bianconi@redhat.com
Subject: Re: [RFT] net: ethernet: enetc: do not always access skb_shared_info in the XDP path
Date: Wed, 14 Dec 2022 16:02:04 +0100	[thread overview]
Message-ID: <Y5nlbERhXA7CYfHd@lore-desk> (raw)
In-Reply-To: <20221213195551.iev4u5niyzvyflyc@skbuf>

[-- Attachment #1: Type: text/plain, Size: 4307 bytes --]

> Hi Lorenzo,
> 
> On Tue, Dec 13, 2022 at 10:46:43AM +0100, Lorenzo Bianconi wrote:
> > Move XDP skb_shared_info structure initialization in from
> > enetc_map_rx_buff_to_xdp() to enetc_add_rx_buff_to_xdp() and do not always
> > access skb_shared_info in the xdp_buff/xdp_frame since it is located in a
> > different cacheline with respect to hard_start and data xdp pointers.
> > Rely on XDP_FLAGS_HAS_FRAGS flag to check if it really necessary to access
> > non-linear part of the xdp_buff/xdp_frame.
> > 
> > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> > ---
> > This patch is based on the following series not applied yet to next-next:
> > https://patchwork.kernel.org/project/netdevbpf/cover/cover.1670680119.git.lorenzo@kernel.org/
> > ---
> >  drivers/net/ethernet/freescale/enetc/enetc.c | 14 ++++++++------
> >  1 file changed, 8 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
> > index cd8f5f0c6b54..2ed6b163f3c8 100644
> > --- a/drivers/net/ethernet/freescale/enetc/enetc.c
> > +++ b/drivers/net/ethernet/freescale/enetc/enetc.c
> > @@ -1305,6 +1305,10 @@ static int enetc_xdp_frame_to_xdp_tx_swbd(struct enetc_bdr *tx_ring,
> >  	xdp_tx_swbd->xdp_frame = NULL;
> >  
> >  	n++;
> > +
> > +	if (!xdp_frame_has_frags(xdp_frame))
> > +		goto out;
> > +
> 
> Tested this with single-buffer devmap XDP_REDIRECT, can't test with
> multi-buffer I think.

ack, thx for testing. I will add this patch to the prvious series.
In oreder to test it with xdp-mb I think you can redirect into a cpumap and
then attach a program on the cpumap to redirect back to the nic, but for the
moment you need to comment out this line:

https://github.com/torvalds/linux/blob/master/net/core/filter.c#L4291

Regards,
Lorenzo

> 
> >  	xdp_tx_swbd = &xdp_tx_arr[n];
> >  
> >  	shinfo = xdp_get_shared_info_from_frame(xdp_frame);
> > @@ -1334,7 +1338,7 @@ static int enetc_xdp_frame_to_xdp_tx_swbd(struct enetc_bdr *tx_ring,
> >  		n++;
> >  		xdp_tx_swbd = &xdp_tx_arr[n];
> >  	}
> > -
> > +out:
> >  	xdp_tx_arr[n - 1].is_eof = true;
> >  	xdp_tx_arr[n - 1].xdp_frame = xdp_frame;
> >  
> > @@ -1390,16 +1394,12 @@ static void enetc_map_rx_buff_to_xdp(struct enetc_bdr *rx_ring, int i,
> >  {
> >  	struct enetc_rx_swbd *rx_swbd = enetc_get_rx_buff(rx_ring, i, size);
> >  	void *hard_start = page_address(rx_swbd->page) + rx_swbd->page_offset;
> > -	struct skb_shared_info *shinfo;
> >  
> >  	/* To be used for XDP_TX */
> >  	rx_swbd->len = size;
> >  
> >  	xdp_prepare_buff(xdp_buff, hard_start - rx_ring->buffer_offset,
> >  			 rx_ring->buffer_offset, size, false);
> > -
> > -	shinfo = xdp_get_shared_info_from_buff(xdp_buff);
> > -	shinfo->nr_frags = 0;
> >  }
> >  
> >  static void enetc_add_rx_buff_to_xdp(struct enetc_bdr *rx_ring, int i,
> > @@ -1407,7 +1407,7 @@ static void enetc_add_rx_buff_to_xdp(struct enetc_bdr *rx_ring, int i,
> >  {
> >  	struct skb_shared_info *shinfo = xdp_get_shared_info_from_buff(xdp_buff);
> >  	struct enetc_rx_swbd *rx_swbd = enetc_get_rx_buff(rx_ring, i, size);
> > -	skb_frag_t *frag = &shinfo->frags[shinfo->nr_frags];
> > +	skb_frag_t *frag;
> >  
> >  	/* To be used for XDP_TX */
> >  	rx_swbd->len = size;
> > @@ -1415,6 +1415,7 @@ static void enetc_add_rx_buff_to_xdp(struct enetc_bdr *rx_ring, int i,
> >  	if (!xdp_buff_has_frags(xdp_buff)) {
> >  		xdp_buff_set_frags_flag(xdp_buff);
> >  		shinfo->xdp_frags_size = size;
> > +		shinfo->nr_frags = 0;
> 
> Tested this and enetc_map_rx_buff_to_xdp() with single-buffer and
> multi-buffer XDP_TX.
> 
> >  	} else {
> >  		shinfo->xdp_frags_size += size;
> >  	}
> > @@ -1422,6 +1423,7 @@ static void enetc_add_rx_buff_to_xdp(struct enetc_bdr *rx_ring, int i,
> >  	if (page_is_pfmemalloc(rx_swbd->page))
> >  		xdp_buff_set_frag_pfmemalloc(xdp_buff);
> >  
> > +	frag = &shinfo->frags[shinfo->nr_frags];
> >  	skb_frag_off_set(frag, rx_swbd->page_offset);
> >  	skb_frag_size_set(frag, size);
> >  	__skb_frag_set_page(frag, rx_swbd->page);
> > -- 
> > 2.38.1
> >
> 
> Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
> Tested-by: Vladimir Oltean <vladimir.oltean@nxp.com>
> 
> Thanks.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

      reply	other threads:[~2022-12-14 15:02 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-13  9:46 [RFT] net: ethernet: enetc: do not always access skb_shared_info in the XDP path Lorenzo Bianconi
2022-12-13 19:55 ` Vladimir Oltean
2022-12-14 15:02   ` Lorenzo Bianconi [this message]

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=Y5nlbERhXA7CYfHd@lore-desk \
    --to=lorenzo@kernel.org \
    --cc=claudiu.manoil@nxp.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=kuba@kernel.org \
    --cc=lorenzo.bianconi@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=vladimir.oltean@nxp.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.