[Intel-wired-lan] [next PATCH 3/3] ixgbe: Support 4 queue RSS on VFs with 1 or 2 queue RSS on PF

Ruslan Nikolaev ruslan at purestorage.com
Thu Sep 8 18:20:08 UTC 2016


Thank you very much for giving the feedback and creating new set of patches!

Ruslan

On Sep 7, 2016, at 8:28 PM, Alexander Duyck <alexander.duyck at gmail.com> wrote:

> From: Alexander Duyck <alexander.h.duyck at intel.com>
> 
> Instead of limiting the VFs if we don't use 4 queues for RSS in the PF we
> can instead just limit the RSS queues used to a power of 2.  By doing this
> we can support use cases where VFs are using more queues than the PF is
> currently using and can support RSS if so desired.
> 
> The only limitation on this is that we cannot support 3 queues of RSS in
> the PF or VF.  In either of these cases we should fall back to 2 queues in
> order to be able to use the power of 2 masking provided by the psrtype
> register.
> 
> Signed-off-by: Alexander Duyck <alexander.h.duyck at intel.com>
> ---
> drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c  |    7 ++++---
> drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |   12 +++++++-----
> 2 files changed, 11 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c
> index bcdc88444ceb..15ab337fd7ad 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c
> @@ -515,15 +515,16 @@ static bool ixgbe_set_sriov_queues(struct ixgbe_adapter *adapter)
>  	vmdq_i = min_t(u16, IXGBE_MAX_VMDQ_INDICES, vmdq_i);
> 
>  	/* 64 pool mode with 2 queues per pool */
> -	if ((vmdq_i > 32) || (rss_i < 4) || (vmdq_i > 16 && pools)) {
> +	if ((vmdq_i > 32) || (vmdq_i > 16 && pools)) {
>  		vmdq_m = IXGBE_82599_VMDQ_2Q_MASK;
>  		rss_m = IXGBE_RSS_2Q_MASK;
>  		rss_i = min_t(u16, rss_i, 2);
> -	/* 32 pool mode with 4 queues per pool */
> +	/* 32 pool mode with up to 4 queues per pool */
>  	} else {
>  		vmdq_m = IXGBE_82599_VMDQ_4Q_MASK;
>  		rss_m = IXGBE_RSS_4Q_MASK;
> -		rss_i = 4;
> +		/* We can support 4, 2, or 1 queues */
> +		rss_i = (rss_i > 3) ? 4 : (rss_i > 1) ? 2 : 1;
>  	}
> 
> #ifdef IXGBE_FCOE
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> index 1c888588cecd..a244d9a67264 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> @@ -3248,7 +3248,8 @@ static void ixgbe_setup_mtqc(struct ixgbe_adapter *adapter)
>  			mtqc |= IXGBE_MTQC_RT_ENA | IXGBE_MTQC_8TC_8TQ;
>  		else if (tcs > 1)
>  			mtqc |= IXGBE_MTQC_RT_ENA | IXGBE_MTQC_4TC_4TQ;
> -		else if (adapter->ring_feature[RING_F_RSS].indices == 4)
> +		else if (adapter->ring_feature[RING_F_VMDQ].mask ==
> +			 IXGBE_82599_VMDQ_4Q_MASK)
>  			mtqc |= IXGBE_MTQC_32VF;
>  		else
>  			mtqc |= IXGBE_MTQC_64VF;
> @@ -3475,12 +3476,12 @@ static void ixgbe_setup_reta(struct ixgbe_adapter *adapter)
>  	u32 reta_entries = ixgbe_rss_indir_tbl_entries(adapter);
>  	u16 rss_i = adapter->ring_feature[RING_F_RSS].indices;
> 
> -	/* Program table for at least 2 queues w/ SR-IOV so that VFs can
> +	/* Program table for at least 4 queues w/ SR-IOV so that VFs can
>  	 * make full use of any rings they may have.  We will use the
>  	 * PSRTYPE register to control how many rings we use within the PF.
>  	 */
> -	if ((adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) && (rss_i < 2))
> -		rss_i = 2;
> +	if ((adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) && (rss_i < 4))
> +		rss_i = 4;
> 
>  	/* Fill out hash function seeds */
>  	for (i = 0; i < 10; i++)
> @@ -3544,7 +3545,8 @@ static void ixgbe_setup_mrqc(struct ixgbe_adapter *adapter)
>  				mrqc = IXGBE_MRQC_VMDQRT8TCEN;	/* 8 TCs */
>  			else if (tcs > 1)
>  				mrqc = IXGBE_MRQC_VMDQRT4TCEN;	/* 4 TCs */
> -			else if (adapter->ring_feature[RING_F_RSS].indices == 4)
> +			else if (adapter->ring_feature[RING_F_VMDQ].mask ==
> +				 IXGBE_82599_VMDQ_4Q_MASK)
>  				mrqc = IXGBE_MRQC_VMDQRSS32EN;
>  			else
>  				mrqc = IXGBE_MRQC_VMDQRSS64EN;
> 



More information about the Intel-wired-lan mailing list