net: netsec: Correct dma sync for XDP_TX frames

Message ID 20191016114032.21617-1-ilias.apalodimas@linaro.org
State New
Headers show
Series
  • net: netsec: Correct dma sync for XDP_TX frames
Related show

Commit Message

Ilias Apalodimas Oct. 16, 2019, 11:40 a.m.
bpf_xdp_adjust_head() can change the frame boundaries. Account for the
potential shift properly by calculating the new offset before
syncing the buffer to the device for XDP_TX

Fixes: ba2b232108d3 ("net: netsec: add XDP support")
Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

---
 drivers/net/ethernet/socionext/netsec.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

-- 
2.23.0

Comments

Jakub Kicinski Oct. 17, 2019, 12:14 a.m. | #1
On Wed, 16 Oct 2019 14:40:32 +0300, Ilias Apalodimas wrote:
> bpf_xdp_adjust_head() can change the frame boundaries. Account for the

> potential shift properly by calculating the new offset before

> syncing the buffer to the device for XDP_TX

> 

> Fixes: ba2b232108d3 ("net: netsec: add XDP support")

> Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>


Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>


You should target this to the bpf or net tree (appropriate [PATCH xyz]
marking). Although I must admit it's unclear to me as well whether the
driver changes should be picked up by bpf maintainers or Dave :S

> diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c

> index f9e6744d8fd6..41ddd8fff2a7 100644

> --- a/drivers/net/ethernet/socionext/netsec.c

> +++ b/drivers/net/ethernet/socionext/netsec.c

> @@ -847,8 +847,8 @@ static u32 netsec_xdp_queue_one(struct netsec_priv *priv,

>  		enum dma_data_direction dma_dir =

>  			page_pool_get_dma_dir(rx_ring->page_pool);

>  

> -		dma_handle = page_pool_get_dma_addr(page) +

> -			NETSEC_RXBUF_HEADROOM;

> +		dma_handle = page_pool_get_dma_addr(page) + xdpf->headroom +

> +			sizeof(*xdpf);


very nitpick: I'd personally write addr + sizeof(*xdpf) + xdpf->headroom
since that's the order in which they appear in memory

But likely not worth reposting for just that :)

>  		dma_sync_single_for_device(priv->dev, dma_handle, xdpf->len,

>  					   dma_dir);

>  		tx_desc.buf_type = TYPE_NETSEC_XDP_TX;
Ilias Apalodimas Oct. 17, 2019, 6:49 a.m. | #2
Hi Jakub, 

On Wed, Oct 16, 2019 at 05:14:01PM -0700, Jakub Kicinski wrote:
> On Wed, 16 Oct 2019 14:40:32 +0300, Ilias Apalodimas wrote:

> > bpf_xdp_adjust_head() can change the frame boundaries. Account for the

> > potential shift properly by calculating the new offset before

> > syncing the buffer to the device for XDP_TX

> > 

> > Fixes: ba2b232108d3 ("net: netsec: add XDP support")

> > Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

> 

> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>

> 

> You should target this to the bpf or net tree (appropriate [PATCH xyz]

> marking). Although I must admit it's unclear to me as well whether the

> driver changes should be picked up by bpf maintainers or Dave :S


My bad i forgot to add the net-next tag. I'd prefer Dave picking that up, since
he picked all the XDP-related patches for this driver before. 
Dave shall i re-send with the proper tag?

> 

> > diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c

> > index f9e6744d8fd6..41ddd8fff2a7 100644

> > --- a/drivers/net/ethernet/socionext/netsec.c

> > +++ b/drivers/net/ethernet/socionext/netsec.c

> > @@ -847,8 +847,8 @@ static u32 netsec_xdp_queue_one(struct netsec_priv *priv,

> >  		enum dma_data_direction dma_dir =

> >  			page_pool_get_dma_dir(rx_ring->page_pool);

> >  

> > -		dma_handle = page_pool_get_dma_addr(page) +

> > -			NETSEC_RXBUF_HEADROOM;

> > +		dma_handle = page_pool_get_dma_addr(page) + xdpf->headroom +

> > +			sizeof(*xdpf);

> 

> very nitpick: I'd personally write addr + sizeof(*xdpf) + xdpf->headroom

> since that's the order in which they appear in memory

> 

> But likely not worth reposting for just that :)


Isn't sizeof static anyway? If Dave needs a v2 with the proper tag i'll change
this as well 

> 

> >  		dma_sync_single_for_device(priv->dev, dma_handle, xdpf->len,

> >  					   dma_dir);

> >  		tx_desc.buf_type = TYPE_NETSEC_XDP_TX;

> 


Thanks
/Ilias

Patch

diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c
index f9e6744d8fd6..41ddd8fff2a7 100644
--- a/drivers/net/ethernet/socionext/netsec.c
+++ b/drivers/net/ethernet/socionext/netsec.c
@@ -847,8 +847,8 @@  static u32 netsec_xdp_queue_one(struct netsec_priv *priv,
 		enum dma_data_direction dma_dir =
 			page_pool_get_dma_dir(rx_ring->page_pool);
 
-		dma_handle = page_pool_get_dma_addr(page) +
-			NETSEC_RXBUF_HEADROOM;
+		dma_handle = page_pool_get_dma_addr(page) + xdpf->headroom +
+			sizeof(*xdpf);
 		dma_sync_single_for_device(priv->dev, dma_handle, xdpf->len,
 					   dma_dir);
 		tx_desc.buf_type = TYPE_NETSEC_XDP_TX;