[dpdk-dev,2/2] net/mlx5: add hardware TSO support for VXLAN and GRE

Message ID 1488297228-45713-3-git-send-email-shahafs@mellanox.com (mailing list archive)
State Superseded, archived
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail apply patch file failure

Commit Message

Shahaf Shuler Feb. 28, 2017, 3:53 p.m. UTC
  This commit adds support for hardware TSO for tunneled packets.

Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
---
 drivers/net/mlx5/mlx5_ethdev.c | 4 +++-
 drivers/net/mlx5/mlx5_rxtx.c   | 9 +++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)
  

Comments

Nélio Laranjeiro March 1, 2017, 2:51 p.m. UTC | #1
On Tue, Feb 28, 2017 at 05:53:48PM +0200, Shahaf Shuler wrote:
> This commit adds support for hardware TSO for tunneled packets.
> 
> Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> ---
>  drivers/net/mlx5/mlx5_ethdev.c | 4 +++-
>  drivers/net/mlx5/mlx5_rxtx.c   | 9 +++++++++
>  2 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> index 3edfd49..4de3595 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -696,7 +696,9 @@ struct priv *
>  	if (priv->tso)
>  		info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
>  	if (priv->tunnel_en)
> -		info->tx_offload_capa |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
> +		info->tx_offload_capa |= (DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM |
> +					  DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
> +					  DEV_TX_OFFLOAD_GRE_TNL_TSO);
>  	if (priv_get_ifname(priv, &ifname) == 0)
>  		info->if_index = if_nametoindex(ifname);
>  	/* FIXME: RETA update/query API expects the callee to know the size of
> diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
> index 145daa0..98e7205 100644
> --- a/drivers/net/mlx5/mlx5_rxtx.c
> +++ b/drivers/net/mlx5/mlx5_rxtx.c
> @@ -488,9 +488,18 @@
>  						(1 << txq->wqe_n) *
>  						MLX5_WQE_SIZE);
>  				unsigned int copy_b;
> +				const uint64_t is_tunneled =
> +							buf->ol_flags &
> +							(PKT_TX_TUNNEL_GRE |
> +							 PKT_TX_TUNNEL_VXLAN);
>  
>  				tso_header_sz = buf->l2_len + buf->l3_len +
>  						buf->l4_len;
> +
> +				if (is_tunneled	&& txq->tunnel_en) {
> +					tso_header_sz += buf->outer_l2_len +
> +							 buf->outer_l3_len;
> +				}
>  				if (unlikely(tso_header_sz >
>  					     MLX5_MAX_TSO_HEADER))
>  					break;
> -- 
> 1.8.3.1
 
Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
  

Patch

diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index 3edfd49..4de3595 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -696,7 +696,9 @@  struct priv *
 	if (priv->tso)
 		info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
 	if (priv->tunnel_en)
-		info->tx_offload_capa |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+		info->tx_offload_capa |= (DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM |
+					  DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+					  DEV_TX_OFFLOAD_GRE_TNL_TSO);
 	if (priv_get_ifname(priv, &ifname) == 0)
 		info->if_index = if_nametoindex(ifname);
 	/* FIXME: RETA update/query API expects the callee to know the size of
diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
index 145daa0..98e7205 100644
--- a/drivers/net/mlx5/mlx5_rxtx.c
+++ b/drivers/net/mlx5/mlx5_rxtx.c
@@ -488,9 +488,18 @@ 
 						(1 << txq->wqe_n) *
 						MLX5_WQE_SIZE);
 				unsigned int copy_b;
+				const uint64_t is_tunneled =
+							buf->ol_flags &
+							(PKT_TX_TUNNEL_GRE |
+							 PKT_TX_TUNNEL_VXLAN);
 
 				tso_header_sz = buf->l2_len + buf->l3_len +
 						buf->l4_len;
+
+				if (is_tunneled	&& txq->tunnel_en) {
+					tso_header_sz += buf->outer_l2_len +
+							 buf->outer_l3_len;
+				}
 				if (unlikely(tso_header_sz >
 					     MLX5_MAX_TSO_HEADER))
 					break;