[Intel-wired-lan] [next PATCH S58 5/5] i40e: don't add more vectors to num_lan_msix than number of CPUs

Keller, Jacob E jacob.e.keller at intel.com
Wed Dec 28 18:46:26 UTC 2016


Looks good.. Thanks Bimmy!

Regards,
Jake

> -----Original Message-----
> From: Pujari, Bimmy
> Sent: Tuesday, December 27, 2016 9:56 AM
> To: intel-wired-lan at lists.osuosl.org
> Cc: Keller, Jacob E <jacob.e.keller at intel.com>; Ramamurthy, Harshitha
> <harshitha.ramamurthy at intel.com>; Wyborny, Carolyn
> <carolyn.wyborny at intel.com>
> Subject: [next PATCH S58 5/5] i40e: don't add more vectors to num_lan_msix
> than number of CPUs
> 
> From: Jacob Keller <jacob.e.keller at intel.com>
> 
> This is a solution to avoid adding too many queues to num_lan_msix.
> A recent refactor of queue pairs accidentally added all remaining
> vectors to the num_lan_msix which can have adverse performance issues,
> due to enabling more queues than the number of CPU cores.
> 
> This patch removes the old calculation, and replaces it with a simple
> algorithm.
> 
> 1) add queue pairs up to num_online_cpus(), but capped at half of total
>    vectors
> 2) then add alternative features such as flow directory and similar
> 3) finally, add the remaining vectors back to queue pairs, but capped
>    such that the total number of queue pairs does not exceed
>    num_online_cpus().
> 
> Signed-off-by: Jacob Keller <jacob.e.keller at intel.com>
> Signed-off-by: Harshitha Ramamurthy <harshitha.ramamurthy at intel.com>
> Signed-off-by: Carolyn Wyborny <carolyn.wyborny at intel.com>
> Change-ID: I668abf67d5011a1248866daba8885f4ff00cb8d9
> ---
>  drivers/net/ethernet/intel/i40e/i40e_main.c | 30
> ++++++++++++++++++++++++++---
>  1 file changed, 27 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
> b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index d87677d..b1ae843 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -7837,6 +7837,7 @@ static int i40e_reserve_msix_vectors(struct i40e_pf *pf,
> int v_budget)
>  static int i40e_init_msix(struct i40e_pf *pf)
>  {
>  	struct i40e_hw *hw = &pf->hw;
> +	int cpus, extra_vectors;
>  	int vectors_left;
>  	int v_budget, i;
>  	int v_actual;
> @@ -7872,10 +7873,16 @@ static int i40e_init_msix(struct i40e_pf *pf)
>  		vectors_left--;
>  	}
> 
> -	/* reserve vectors for the main PF traffic queues */
> -	pf->num_lan_msix = min_t(int, num_online_cpus(), vectors_left);
> +	/* reserve some vectors for the main PF traffic queues. Initially we
> +	 * only reserve at most 50% of the available vectors, in the case that
> +	 * the number of online CPUs is large. This ensures that we can enable
> +	 * extra features as well. Once we've enabled the other features, we
> +	 * will use any remaining vectors to reach as close as we can to the
> +	 * number of online CPUs.
> +	 */
> +	cpus = num_online_cpus();
> +	pf->num_lan_msix = min_t(int, cpus, vectors_left / 2);
>  	vectors_left -= pf->num_lan_msix;
> -	v_budget += pf->num_lan_msix;
> 
>  	/* reserve one vector for sideband flow director */
>  	if (pf->flags & I40E_FLAG_FD_SB_ENABLED) {
> @@ -7938,6 +7945,23 @@ static int i40e_init_msix(struct i40e_pf *pf)
>  		}
>  	}
> 
> +	/* On systems with a large number of SMP cores, we previously limited
> +	 * the number of vectors for num_lan_msix to be at most 50% of the
> +	 * available vectors, to allow for other features. Now, we add back
> +	 * the remaining vectors. However, we ensure that the total
> +	 * num_lan_msix will not exceed num_online_cpus(). To do this, we
> +	 * calculate the number of vectors we can add without going over the
> +	 * cap of CPUs. For systems with a small number of CPUs this will be
> +	 * zero.
> +	 */
> +	extra_vectors = min_t(int, cpus - pf->num_lan_msix, vectors_left);
> +	pf->num_lan_msix += extra_vectors;
> +	vectors_left -= extra_vectors;
> +
> +	WARN(vectors_left < 0,
> +	     "Calculation of remaining vectors underflowed. This is an accounting
> bug when determining total MSI-X vectors.\n");
> +
> +	v_budget += pf->num_lan_msix;
>  	pf->msix_entries = kcalloc(v_budget, sizeof(struct msix_entry),
>  				   GFP_KERNEL);
>  	if (!pf->msix_entries)
> --
> 2.4.11



More information about the Intel-wired-lan mailing list