Thread (26 messages) flat view 26 messages, 4 authors, 2017-02-09

Re: [PATCH net-next 4/9] mlx4: get rid of frag_prefix_size

From: Tariq Toukan <hidden>
Date: 2017-02-09 12:57:32


On 07/02/2017 5:02 AM, Eric Dumazet wrote:
quoted hunk ↗ jump to hunk
Using per frag storage for frag_prefix_size is really silly.

mlx4_en_complete_rx_desc() has all needed info already.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
  drivers/net/ethernet/mellanox/mlx4/en_rx.c   | 27 ++++++++++++---------------
  drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |  3 +--
  2 files changed, 13 insertions(+), 17 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index f868cb330039f5730ab8f59eca451c3d5272..c6c64ac1e25931fc172beb5c718ec3a799f6 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -585,15 +585,14 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
  				    int length)
  {
  	struct skb_frag_struct *skb_frags_rx = skb_shinfo(skb)->frags;
-	struct mlx4_en_frag_info *frag_info;
-	int nr;
+	struct mlx4_en_frag_info *frag_info = priv->frag_info;
+	int nr, frag_size;
  	dma_addr_t dma;
  
  	/* Collect used fragments while replacing them in the HW descriptors */
-	for (nr = 0; nr < priv->num_frags; nr++) {
-		frag_info = &priv->frag_info[nr];
-		if (length <= frag_info->frag_prefix_size)
-			break;
+	for (nr = 0;;) {
+		frag_size = min_t(int, length, frag_info->frag_size);
+
  		if (unlikely(!frags[nr].page))
  			goto fail;
  
@@ -603,15 +602,16 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
  
  		__skb_fill_page_desc(skb, nr, frags[nr].page,
  				     frags[nr].page_offset,
-				     frag_info->frag_size);
+				     frag_size);
Same for dma_sync_single (two lines above).
quoted hunk ↗ jump to hunk
  
  		skb->truesize += frag_info->frag_stride;
  		frags[nr].page = NULL;
+		nr++;
+		length -= frag_size;
+		if (!length)
+			break;
+		frag_info++;
  	}
-	/* Adjust size of last fragment to match actual length */
-	if (nr > 0)
-		skb_frag_size_set(&skb_frags_rx[nr - 1],
-			length - priv->frag_info[nr - 1].frag_prefix_size);
  	return nr;
  
  fail:
@@ -1194,7 +1194,6 @@ void mlx4_en_calc_rx_buf(struct net_device *dev)
  	if (priv->tx_ring_num[TX_XDP]) {
  		priv->rx_page_order = 0;
  		priv->frag_info[0].frag_size = eff_mtu;
-		priv->frag_info[0].frag_prefix_size = 0;
  		/* This will gain efficient xdp frame recycling at the
  		 * expense of more costly truesize accounting
  		 */
@@ -1209,7 +1208,6 @@ void mlx4_en_calc_rx_buf(struct net_device *dev)
  			priv->frag_info[i].frag_size =
  				(eff_mtu > buf_size + frag_sizes[i]) ?
  					frag_sizes[i] : eff_mtu - buf_size;
-			priv->frag_info[i].frag_prefix_size = buf_size;
  			priv->frag_info[i].frag_stride =
  				ALIGN(priv->frag_info[i].frag_size,
  				      SMP_CACHE_BYTES);
@@ -1229,10 +1227,9 @@ void mlx4_en_calc_rx_buf(struct net_device *dev)
  	       eff_mtu, priv->num_frags);
  	for (i = 0; i < priv->num_frags; i++) {
  		en_err(priv,
-		       "  frag:%d - size:%d prefix:%d stride:%d\n",
+		       "  frag:%d - size:%d stride:%d\n",
  		       i,
  		       priv->frag_info[i].frag_size,
-		       priv->frag_info[i].frag_prefix_size,
  		       priv->frag_info[i].frag_stride);
  	}
  }
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index 11898550f87c077f6687903790d329e4aa1e..fe8ed4e85e9645679cc37d0d30284b523689 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -472,9 +472,8 @@ struct mlx4_en_mc_list {
  
  struct mlx4_en_frag_info {
  	u16 frag_size;
-	u16 frag_prefix_size;
-	u32 frag_stride;
  	u16 rx_headroom;
+	u32 frag_stride;
  };
  
  #ifdef CONFIG_MLX4_EN_DCB
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help