Message ID | 9650a7dfbcfd5f1da21f7b093665abf4b1041071.1380703263.git.agordeev@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
On Wed, Oct 02, 2013 at 12:49:06PM +0200, Alexander Gordeev wrote: > > + err = pci_msix_table_size(dev->pdev); > + if (err < 0) > + return err; > + > nvec = dev->caps.num_ports * num_online_cpus() + MLX5_EQ_VEC_COMP_BASE; > nvec = min_t(int, nvec, num_eqs); > + nvec = min_t(int, nvec, err); > if (nvec <= MLX5_EQ_VEC_COMP_BASE) > return -ENOSPC; Making sure we don't request more vectors then the device's is capable of -- looks good. > > @@ -131,20 +136,15 @@ static int mlx5_enable_msix(struct mlx5_core_dev *dev) > for (i = 0; i < nvec; i++) > table->msix_arr[i].entry = i; > > -retry: > - table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; > err = pci_enable_msix(dev->pdev, table->msix_arr, nvec); > - if (err <= 0) { > + if (err) { > + kfree(table->msix_arr); > return err; > - } else if (err > MLX5_EQ_VEC_COMP_BASE) { > - nvec = err; > - goto retry; > } > According to latest sources, pci_enable_msix() may still fail so why do you want to remove this code? > - mlx5_core_dbg(dev, "received %d MSI vectors out of %d requested\n", err, nvec); > - kfree(table->msix_arr); > + table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; > > - return -ENOSPC; > + return 0; > } > > static void mlx5_disable_msix(struct mlx5_core_dev *dev) > -- > 1.7.7.6 > > -- > To unsubscribe from this list: send the line "unsubscribe netdev" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Oct 03, 2013 at 10:14:33AM +0300, Eli Cohen wrote: > On Wed, Oct 02, 2013 at 12:49:06PM +0200, Alexander Gordeev wrote: > > > > + err = pci_msix_table_size(dev->pdev); > > + if (err < 0) > > + return err; > > + > > nvec = dev->caps.num_ports * num_online_cpus() + MLX5_EQ_VEC_COMP_BASE; > > nvec = min_t(int, nvec, num_eqs); > > + nvec = min_t(int, nvec, err); > > if (nvec <= MLX5_EQ_VEC_COMP_BASE) > > return -ENOSPC; > > Making sure we don't request more vectors then the device's is capable > of -- looks good. > > > > @@ -131,20 +136,15 @@ static int mlx5_enable_msix(struct mlx5_core_dev *dev) > > for (i = 0; i < nvec; i++) > > table->msix_arr[i].entry = i; > > > > -retry: > > - table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; > > err = pci_enable_msix(dev->pdev, table->msix_arr, nvec); > > - if (err <= 0) { > > + if (err) { > > + kfree(table->msix_arr); > > return err; > > - } else if (err > MLX5_EQ_VEC_COMP_BASE) { > > - nvec = err; > > - goto retry; > > } > > > > According to latest sources, pci_enable_msix() may still fail so why > do you want to remove this code? pci_enable_msix() may fail, but it can not return a positive number. We first calculate how many MSI-Xs we need, adjust to what we can get, check if that is enough and only then go for it. > > - mlx5_core_dbg(dev, "received %d MSI vectors out of %d requested\n", err, nvec); > > - kfree(table->msix_arr); > > + table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; > > > > - return -ENOSPC; > > + return 0; > > } > > > > static void mlx5_disable_msix(struct mlx5_core_dev *dev)
On Thu, Oct 03, 2013 at 09:48:39PM +0200, Alexander Gordeev wrote: > > pci_enable_msix() may fail, but it can not return a positive number. > That is true according to the current logic but the comment on top of pci_enable_msix() still says: "A return of < 0 indicates a failure. Or a return of > 0 indicates that driver request is exceeding the number of irqs or MSI-X vectors available" So you're counting on an implementation that may change in the future. I think leaving the code as it is now is safer. -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index adf0e5d..5c21e50 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c @@ -119,8 +119,13 @@ static int mlx5_enable_msix(struct mlx5_core_dev *dev) int err; int i; + err = pci_msix_table_size(dev->pdev); + if (err < 0) + return err; + nvec = dev->caps.num_ports * num_online_cpus() + MLX5_EQ_VEC_COMP_BASE; nvec = min_t(int, nvec, num_eqs); + nvec = min_t(int, nvec, err); if (nvec <= MLX5_EQ_VEC_COMP_BASE) return -ENOSPC; @@ -131,20 +136,15 @@ static int mlx5_enable_msix(struct mlx5_core_dev *dev) for (i = 0; i < nvec; i++) table->msix_arr[i].entry = i; -retry: - table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; err = pci_enable_msix(dev->pdev, table->msix_arr, nvec); - if (err <= 0) { + if (err) { + kfree(table->msix_arr); return err; - } else if (err > MLX5_EQ_VEC_COMP_BASE) { - nvec = err; - goto retry; } - mlx5_core_dbg(dev, "received %d MSI vectors out of %d requested\n", err, nvec); - kfree(table->msix_arr); + table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; - return -ENOSPC; + return 0; } static void mlx5_disable_msix(struct mlx5_core_dev *dev)
As result of recent re-design of the MSI/MSI-X interrupts enabling pattern this driver has to be updated to use the new technique to obtain a optimal number of MSI/MSI-X interrupts required. Signed-off-by: Alexander Gordeev <agordeev@redhat.com> --- drivers/net/ethernet/mellanox/mlx5/core/main.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-)