[Intel-wired-lan] [next PATCH S58 4/5] i40e/i40evf: don't open code pci_enable_msix_range

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


Hi,

> -----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>
> Subject: [next PATCH S58 4/5] i40e/i40evf: don't open code
> pci_enable_msix_range
> 
> From: Jacob Keller <jacob.e.keller at intel.com>
> 
> Make use of the available kernel facility and don't re-write
> pci_enable_msix_range function in the driver.
> 
> Signed-off-by: Jacob Keller <jacob.e.keller at intel.com>
> Change-Id: I3d2dd7fdb0ea7c3029f2ddafee3240ae21104e8b
> ---
>  drivers/net/ethernet/intel/i40e/i40e_main.c     | 28 ++++++++++++----------
>  drivers/net/ethernet/intel/i40evf/i40evf_main.c | 32 +++++++++++++------------
>  2 files changed, 33 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
> b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 227a06c..d87677d 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -7804,21 +7804,26 @@ static int i40e_alloc_rings(struct i40e_vsi *vsi)
>  /**
>   * i40e_reserve_msix_vectors - Reserve MSI-X vectors in the kernel
>   * @pf: board private structure
> - * @vectors: the number of MSI-X vectors to request
> + * @v_budget: the number of MSI-X vectors to request
>   *
>   * Returns the number of vectors reserved, or error
>   **/
> -static int i40e_reserve_msix_vectors(struct i40e_pf *pf, int vectors)
> +static int i40e_reserve_msix_vectors(struct i40e_pf *pf, int v_budget)
>  {
> -	vectors = pci_enable_msix_range(pf->pdev, pf->msix_entries,
> -					I40E_MIN_MSIX, vectors);
> -	if (vectors < 0) {
> +	int v_actual = 0;
> +
> +	v_actual = pci_enable_msix_range(pf->pdev,
> +					 pf->msix_entries,
> +					 I40E_MIN_MSIX,
> +					 v_budget);
> +	if (v_actual < 0)
>  		dev_info(&pf->pdev->dev,
> -			 "MSI-X vector reservation failed: %d\n", vectors);
> -		vectors = 0;
> -	}
> +			 "MSI-X vector reservation failed: %d\n", v_actual);
> +	dev_info(&pf->pdev->dev,
> +		 "%s: MSI-X vectors reserved: %d\n",
> +		 __func__, v_actual);
> 
> -	return vectors;
> +	return v_actual;
>  }
> 
>  /**
> @@ -7941,15 +7946,14 @@ static int i40e_init_msix(struct i40e_pf *pf)
>  	for (i = 0; i < v_budget; i++)
>  		pf->msix_entries[i].entry = i;
>  	v_actual = i40e_reserve_msix_vectors(pf, v_budget);
> -
>  	if (v_actual < I40E_MIN_MSIX) {
>  		pf->flags &= ~I40E_FLAG_MSIX_ENABLED;
>  		kfree(pf->msix_entries);
>  		pf->msix_entries = NULL;
> -		pci_disable_msix(pf->pdev);
>  		return -ENODEV;
> +	}
> 
> -	} else if (v_actual == I40E_MIN_MSIX) {
> +	if (v_actual == I40E_MIN_MSIX) {
>  		/* Adjust for minimal MSIX use */
>  		pf->num_vmdq_vsis = 0;
>  		pf->num_vmdq_qps = 0;
> diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
> b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
> index 9492b20..71e2c90 100644
> --- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
> +++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
> @@ -1122,34 +1122,36 @@ void i40evf_down(struct i40evf_adapter *adapter)
>  static int
>  i40evf_acquire_msix_vectors(struct i40evf_adapter *adapter, int vectors)
>  {
> -	int err, vector_threshold;
> +	int v_actual;
> 
>  	/* We'll want at least 3 (vector_threshold):
>  	 * 0) Other (Admin Queue and link, mostly)
>  	 * 1) TxQ[0] Cleanup
>  	 * 2) RxQ[0] Cleanup
> -	 */
> -	vector_threshold = MIN_MSIX_COUNT;
> -
> -	/* The more we get, the more we will assign to Tx/Rx Cleanup
> +	 *
> +	 * The more we get, the more we will assign to Tx/Rx Cleanup
>  	 * for the separate queues...where Rx Cleanup >= Tx Cleanup.
>  	 * Right now, we simply care about how many we'll get; we'll
>  	 * set them up later while requesting irq's.
>  	 */
> -	err = pci_enable_msix_range(adapter->pdev, adapter->msix_entries,
> -				    vector_threshold, vectors);
> -	if (err < 0) {
> -		dev_err(&adapter->pdev->dev, "Unable to allocate MSI-X
> interrupts\n");
> +	v_actual = pci_enable_msix_range(adapter->pdev, adapter-
> >msix_entries,
> +					 MIN_MSIX_COUNT, vectors);
> +	if (v_actual < 0) {
> +		dev_err(&adapter->pdev->dev, "Unable to allocate MSI-X
> interrupts: %d\n",
> +			v_actual);
>  		kfree(adapter->msix_entries);
>  		adapter->msix_entries = NULL;
> -		return err;
> +		return v_actual;
>  	}
> 
> -	/* Adjust for only the vectors we'll use, which is minimum
> -	 * of max_msix_q_vectors + NONQ_VECS, or the number of
> -	 * vectors we were allocated.
> -	 */
> -	adapter->num_msix_vectors = err;
> +	if (CLIENT_ENABLED(adapter)) {
> +		adapter->num_iwarp_msix = (v_actual - 1) / 2;
> +		adapter->num_msix_vectors = v_actual - adapter-
> >num_iwarp_msix;
> +		adapter->iwarp_base_vector = adapter->num_msix_vectors;
> +	} else {
> +		adapter->num_msix_vectors = v_actual;
> +	}
> +	adapter->num_msix_vectors = v_actual;

This still doesn't look right. I think the last line here needs to be dropped. Otherwise why have the else block at all, and why set num_msix_vectors separately in the first section? Ya, basically the code upstream doesn't have all of the CLIENT_ENABLED bits here. You need to drop the last line here I just marked, or you need to drop all the client enabled bits. Since the original code doesn't have the CLIENT_ENABLED portion, I suggest dropping that part for now and re-adding client support to this in a future patch.

>  	return 0;
>  }
> 
> --
> 2.4.11



More information about the Intel-wired-lan mailing list