[Intel-wired-lan] [next, S23, 06/13] i40e/i40evf: tunnels can be generic

Alexander Duyck alexander.duyck at gmail.com
Wed Jan 20 03:54:07 UTC 2016


On 12/09/2015 03:50 PM, Hay, Joshua A wrote:
> From: Jesse Brandeburg <jesse.brandeburg at intel.com>
>
> Since the i40e driver now supports VxLAN, GRE, and soon
> to be Geneve tunnels, the driver can just note that an skb
> contains a tunneled packet generically, instead of calling
> out VXLAN specifically.  The tunnel set up we do for hardware
> is almost always the same for all tunnel types.
>
> This specifically enables ATR/Flow Director on GRE packets
> which increases performance/scaling.  Without this patch
> GRE RX packets end up on a random RSS assigned queue.
>
> Signed-off-by: Jesse Brandeburg <jesse.brandeburg at intel.com>
> Change-ID: Ie8e205603654910d2f718592cbef8132ae0719e4
> Tested-by: Andrew Bowers <andrewx.bowers at intel.com>
> ---
>   drivers/net/ethernet/intel/i40e/i40e_txrx.c   | 7 ++++---
>   drivers/net/ethernet/intel/i40e/i40e_txrx.h   | 2 +-
>   drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 2 +-
>   drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 2 +-
>   4 files changed, 7 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> index 28d2943..ba79f67 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> @@ -2005,7 +2005,7 @@ static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb,
>   	if (!(tx_flags & (I40E_TX_FLAGS_IPV4 | I40E_TX_FLAGS_IPV6)))
>   		return;
>
> -	if (!(tx_flags & I40E_TX_FLAGS_VXLAN_TUNNEL)) {
> +	if ((tx_flags & I40E_TX_FLAGS_TUNNEL)) {
>   		/* snag network header to get L4 type and address */
>   		hdr.network = skb_network_header(skb);
>

So this patch has a major bug right here.  Specifically it is disabling 
ATR for everything since the logic got flipped an you are checking the 
outer headers for tunneled frames, and the inner headers for 
non-tunneled frames.

There is another bug a bit further down from here where the variable 
protocol is used which means it is outer header only and as such breaks 
any cases where you have v4 over v6 or v6 over v4.


> @@ -2090,7 +2090,7 @@ static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb,
>   		     I40E_TXD_FLTR_QW1_FD_STATUS_SHIFT;
>
>   	dtype_cmd |= I40E_TXD_FLTR_QW1_CNT_ENA_MASK;
> -	if (!(tx_flags & I40E_TX_FLAGS_VXLAN_TUNNEL))
> +	if (!(tx_flags & I40E_TX_FLAGS_TUNNEL))
>   		dtype_cmd |=
>   			((u32)I40E_FD_ATR_STAT_IDX(pf->hw.pf_id) <<
>   			I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT) &
> @@ -2323,10 +2323,11 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,
>   			oudph = udp_hdr(skb);
>   			oiph = ip_hdr(skb);
>   			l4_tunnel = I40E_TXD_CTX_UDP_TUNNELING;
> -			*tx_flags |= I40E_TX_FLAGS_VXLAN_TUNNEL;
> +			*tx_flags |= I40E_TX_FLAGS_TUNNEL;
>   			break;
>   		case IPPROTO_GRE:
>   			l4_tunnel = I40E_TXD_CTX_GRE_TUNNELING;
> +			*tx_flags |= I40E_TX_FLAGS_TUNNEL;
>   			break;
>   		default:
>   			return;
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
> index dccc1eb..1d167b6 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
> @@ -163,7 +163,7 @@ enum i40e_dyn_idx_t {
>   #define I40E_TX_FLAGS_FSO		BIT(7)
>   #define I40E_TX_FLAGS_TSYN		BIT(8)
>   #define I40E_TX_FLAGS_FD_SB		BIT(9)
> -#define I40E_TX_FLAGS_VXLAN_TUNNEL	BIT(10)
> +#define I40E_TX_FLAGS_TUNNEL		BIT(10)
>   #define I40E_TX_FLAGS_VLAN_MASK		0xffff0000
>   #define I40E_TX_FLAGS_VLAN_PRIO_MASK	0xe0000000
>   #define I40E_TX_FLAGS_VLAN_PRIO_SHIFT	29
> diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
> index 7a00657..ed4934a 100644
> --- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
> +++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
> @@ -1521,7 +1521,7 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,
>   			oudph = udp_hdr(skb);
>   			oiph = ip_hdr(skb);
>   			l4_tunnel = I40E_TXD_CTX_UDP_TUNNELING;
> -			*tx_flags |= I40E_TX_FLAGS_VXLAN_TUNNEL;
> +			*tx_flags |= I40E_TX_FLAGS_TUNNEL;
>   			break;
>   		default:
>   			return;
> diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h
> index e29bb3e..d7950b1 100644
> --- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h
> +++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h
> @@ -162,7 +162,7 @@ enum i40e_dyn_idx_t {
>   #define I40E_TX_FLAGS_FCCRC		BIT(6)
>   #define I40E_TX_FLAGS_FSO		BIT(7)
>   #define I40E_TX_FLAGS_FD_SB		BIT(9)
> -#define I40E_TX_FLAGS_VXLAN_TUNNEL	BIT(10)
> +#define I40E_TX_FLAGS_TUNNEL		BIT(10)
>   #define I40E_TX_FLAGS_VLAN_MASK		0xffff0000
>   #define I40E_TX_FLAGS_VLAN_PRIO_MASK	0xe0000000
>   #define I40E_TX_FLAGS_VLAN_PRIO_SHIFT	29
>



More information about the Intel-wired-lan mailing list