aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx4/en_rx.c
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2014-09-05 21:29:45 -0400
committerDavid S. Miller <davem@davemloft.net>2014-09-06 01:35:27 -0400
commitcfecec56ae7c7c40f23fbdac04acee027ca3bd66 (patch)
treef6342031d64052601468c246f046600d1822c3fb /drivers/net/ethernet/mellanox/mlx4/en_rx.c
parent126859b992c30915aba8d6768254212010f1b43c (diff)
mlx4: only pull headers into skb head
Use the new fancy eth_get_headlen() to pull exactly the headers into skb->head. This speeds up GRE traffic (or more generally tunneled traffuc), as GRO can aggregate up to 17 MSS per GRO packet instead of 8. (Pulling too much data was forcing GRO to keep 2 frags per MSS) Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Amir Vadai <amirv@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/en_rx.c')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_rx.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index b7da466a20d8..14686b6f4bc5 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -588,6 +588,8 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
588 skb_copy_to_linear_data(skb, va, length); 588 skb_copy_to_linear_data(skb, va, length);
589 skb->tail += length; 589 skb->tail += length;
590 } else { 590 } else {
591 unsigned int pull_len;
592
591 /* Move relevant fragments to skb */ 593 /* Move relevant fragments to skb */
592 used_frags = mlx4_en_complete_rx_desc(priv, rx_desc, frags, 594 used_frags = mlx4_en_complete_rx_desc(priv, rx_desc, frags,
593 skb, length); 595 skb, length);
@@ -597,16 +599,17 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
597 } 599 }
598 skb_shinfo(skb)->nr_frags = used_frags; 600 skb_shinfo(skb)->nr_frags = used_frags;
599 601
602 pull_len = eth_get_headlen(va, SMALL_PACKET_SIZE);
600 /* Copy headers into the skb linear buffer */ 603 /* Copy headers into the skb linear buffer */
601 memcpy(skb->data, va, HEADER_COPY_SIZE); 604 memcpy(skb->data, va, pull_len);
602 skb->tail += HEADER_COPY_SIZE; 605 skb->tail += pull_len;
603 606
604 /* Skip headers in first fragment */ 607 /* Skip headers in first fragment */
605 skb_shinfo(skb)->frags[0].page_offset += HEADER_COPY_SIZE; 608 skb_shinfo(skb)->frags[0].page_offset += pull_len;
606 609
607 /* Adjust size of first fragment */ 610 /* Adjust size of first fragment */
608 skb_frag_size_sub(&skb_shinfo(skb)->frags[0], HEADER_COPY_SIZE); 611 skb_frag_size_sub(&skb_shinfo(skb)->frags[0], pull_len);
609 skb->data_len = length - HEADER_COPY_SIZE; 612 skb->data_len = length - pull_len;
610 } 613 }
611 return skb; 614 return skb;
612} 615}