RDMA/irdma: Make resource distribution algorithm more QP oriented
authorNayan Kumar <nayan.kumar@intel.com>
Tue, 5 Jul 2022 23:08:12 +0000 (18:08 -0500)
committerLeon Romanovsky <leonro@nvidia.com>
Mon, 18 Jul 2022 07:39:50 +0000 (10:39 +0300)
Adapt the resource distribution algorithm in irdma_cfg_fpm_val to be more
QP oriented. If the configuration is too big for the available memory,
trim the MR and PBLE's first before trimming the QPs. This also avoids
having to double QPs requested as input to algorithm for GEN1 devices.

Link: https://lore.kernel.org/r/20220705230815.265-5-shiraz.saleem@intel.com
Signed-off-by: Nayan Kumar <nayan.kumar@intel.com>
Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/irdma/ctrl.c
drivers/infiniband/hw/irdma/hw.c

index 58c0e181ca2b8454c4d4ee82341766e0c2902106..a41e0d21143ae73eb9dc9bfda772266be598420e 100644 (file)
@@ -4872,10 +4872,12 @@ int irdma_cfg_fpm_val(struct irdma_sc_dev *dev, u32 qp_count)
 
                sd_diff = sd_needed - hmc_fpm_misc->max_sds;
                if (sd_diff > 128) {
-                       if (qpwanted > 128 && sd_diff > 144)
+                       if (!(loop_count % 2) && qpwanted > 128) {
                                qpwanted /= 2;
-                       mrwanted /= 2;
-                       pblewanted /= 2;
+                       } else {
+                               mrwanted /= 2;
+                               pblewanted /= 2;
+                       }
                        continue;
                }
                if (dev->cqp->hmc_profile != IRDMA_HMC_PROFILE_FAVOR_VF &&
index bb60431f9877268d7c6a6b5baf528a156ff7372e..8abbd50fe8337df997e050f69e3f020acca9e960 100644 (file)
@@ -1512,10 +1512,7 @@ static int irdma_hmc_setup(struct irdma_pci_f *rf)
        int status;
        u32 qpcnt;
 
-       if (rf->rdma_ver == IRDMA_GEN_1)
-               qpcnt = rsrc_limits_table[rf->limits_sel].qplimit * 2;
-       else
-               qpcnt = rsrc_limits_table[rf->limits_sel].qplimit;
+       qpcnt = rsrc_limits_table[rf->limits_sel].qplimit;
 
        rf->sd_type = IRDMA_SD_TYPE_DIRECT;
        status = irdma_cfg_fpm_val(&rf->sc_dev, qpcnt);