net/mlx4_core: Use cq quota in SRIOV when creating completion EQs
authorJack Morgenstein <jackm@dev.mellanox.co.il>
Thu, 23 Feb 2017 10:02:44 +0000 (12:02 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Feb 2017 15:57:57 +0000 (10:57 -0500)
When creating EQs to handle CQ completion events for the PF
or for VFs, we create enough EQE entries to handle completions
for the max number of CQs that can use that EQ.

When SRIOV is activated, the max number of CQs a VF (or the PF) can
obtain is its CQ quota (determined by the Hypervisor resource tracker).
Therefore, when creating an EQ, the number of EQE entries that the VF
should request for that EQ is the CQ quota value (and not the total
number of CQs available in the FW).

Under SRIOV, the PF, also must use its CQ quota, because
the resource tracker also controls how many CQs the PF can obtain.

Using the FW total CQs instead of the CQ quota when creating EQs resulted
wasting MTT entries, due to allocating more EQEs than were needed.

Fixes: 5a0d0a6161ae ("mlx4: Structures and init/teardown for VF resource quotas")
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Reported-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/eq.c
drivers/net/ethernet/mellanox/mlx4/main.c

index 39232b6a974f4b4b961d3b0b8634f04e6b9d0caa..07406cf2eacd518e13dbbec31fde907f1c2544a9 100644 (file)
@@ -1249,9 +1249,8 @@ int mlx4_init_eq_table(struct mlx4_dev *dev)
                                        mlx4_warn(dev, "Failed adding irq rmap\n");
                        }
 #endif
-                       err = mlx4_create_eq(dev, dev->caps.num_cqs -
-                                                 dev->caps.reserved_cqs +
-                                                 MLX4_NUM_SPARE_EQE,
+                       err = mlx4_create_eq(dev, dev->quotas.cq +
+                                            MLX4_NUM_SPARE_EQE,
                                             (dev->flags & MLX4_FLAG_MSI_X) ?
                                             i + 1 - !!(i > MLX4_EQ_ASYNC) : 0,
                                             eq);
index 005e1049c97701c6d28841bccb432c02ba097225..21377c315083b686d8db25033583dd020d7e50a6 100644 (file)
@@ -3501,6 +3501,8 @@ slave_start:
                        goto err_disable_msix;
        }
 
+       mlx4_init_quotas(dev);
+
        err = mlx4_setup_hca(dev);
        if (err == -EBUSY && (dev->flags & MLX4_FLAG_MSI_X) &&
            !mlx4_is_mfunc(dev)) {
@@ -3513,7 +3515,6 @@ slave_start:
        if (err)
                goto err_steer;
 
-       mlx4_init_quotas(dev);
        /* When PF resources are ready arm its comm channel to enable
         * getting commands
         */