Commit 0beb44b0 authored by Carol Soto's avatar Carol Soto Committed by David S. Miller

net/mlx4_core: Add extra check for total vfs for SRIOV

Add extra check for total vfs for SRIOV to check if that value is
bigger than total vfs in pci SRIOV capabalities. Fix a check and
print of the number of maximum vfs that hw can handle. Fix a check
and print of the number of maximum vfs per port that driver can handle.
Signed-off-by: default avatarCarol L Soto <clsoto@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d912557b
...@@ -2907,6 +2907,8 @@ static u64 mlx4_enable_sriov(struct mlx4_dev *dev, struct pci_dev *pdev, ...@@ -2907,6 +2907,8 @@ static u64 mlx4_enable_sriov(struct mlx4_dev *dev, struct pci_dev *pdev,
{ {
u64 dev_flags = dev->flags; u64 dev_flags = dev->flags;
int err = 0; int err = 0;
int fw_enabled_sriov_vfs = min(pci_sriov_get_totalvfs(pdev),
MLX4_MAX_NUM_VF);
if (reset_flow) { if (reset_flow) {
dev->dev_vfs = kcalloc(total_vfs, sizeof(*dev->dev_vfs), dev->dev_vfs = kcalloc(total_vfs, sizeof(*dev->dev_vfs),
...@@ -2932,6 +2934,12 @@ static u64 mlx4_enable_sriov(struct mlx4_dev *dev, struct pci_dev *pdev, ...@@ -2932,6 +2934,12 @@ static u64 mlx4_enable_sriov(struct mlx4_dev *dev, struct pci_dev *pdev,
} }
if (!(dev->flags & MLX4_FLAG_SRIOV)) { if (!(dev->flags & MLX4_FLAG_SRIOV)) {
if (total_vfs > fw_enabled_sriov_vfs) {
mlx4_err(dev, "requested vfs (%d) > available vfs (%d). Continuing without SR_IOV\n",
total_vfs, fw_enabled_sriov_vfs);
err = -ENOMEM;
goto disable_sriov;
}
mlx4_warn(dev, "Enabling SR-IOV with %d VFs\n", total_vfs); mlx4_warn(dev, "Enabling SR-IOV with %d VFs\n", total_vfs);
err = pci_enable_sriov(pdev, total_vfs); err = pci_enable_sriov(pdev, total_vfs);
} }
...@@ -3413,20 +3421,20 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data, ...@@ -3413,20 +3421,20 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,
goto err_disable_pdev; goto err_disable_pdev;
} }
} }
if (total_vfs >= MLX4_MAX_NUM_VF) { if (total_vfs > MLX4_MAX_NUM_VF) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Requested more VF's (%d) than allowed (%d)\n", "Requested more VF's (%d) than allowed by hw (%d)\n",
total_vfs, MLX4_MAX_NUM_VF - 1); total_vfs, MLX4_MAX_NUM_VF);
err = -EINVAL; err = -EINVAL;
goto err_disable_pdev; goto err_disable_pdev;
} }
for (i = 0; i < MLX4_MAX_PORTS; i++) { for (i = 0; i < MLX4_MAX_PORTS; i++) {
if (nvfs[i] + nvfs[2] >= MLX4_MAX_NUM_VF_P_PORT) { if (nvfs[i] + nvfs[2] > MLX4_MAX_NUM_VF_P_PORT) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Requested more VF's (%d) for port (%d) than allowed (%d)\n", "Requested more VF's (%d) for port (%d) than allowed by driver (%d)\n",
nvfs[i] + nvfs[2], i + 1, nvfs[i] + nvfs[2], i + 1,
MLX4_MAX_NUM_VF_P_PORT - 1); MLX4_MAX_NUM_VF_P_PORT);
err = -EINVAL; err = -EINVAL;
goto err_disable_pdev; goto err_disable_pdev;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment