i40iw: Query device accounts for internal rsrc
authorHenry Orosco <henry.orosco@intel.com>
Thu, 10 Nov 2016 03:30:28 +0000 (21:30 -0600)
committerDoug Ledford <dledford@redhat.com>
Mon, 5 Dec 2016 21:09:35 +0000 (16:09 -0500)
Some resources are consumed internally and not available to the user.
After hw is initialized, figure out how many resources are consumed
and subtract those numbers from the initial max device capability in
i40iw_query_device().

Signed-off-by: Henry Orosco <henry.orosco@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/i40iw/i40iw.h
drivers/infiniband/hw/i40iw/i40iw_hw.c
drivers/infiniband/hw/i40iw/i40iw_main.c
drivers/infiniband/hw/i40iw/i40iw_user.h
drivers/infiniband/hw/i40iw/i40iw_verbs.c

index 4a0c12bd9caac37c4bc985c7f8ad040e145c2e85..dac9a6bcc63148d05bc4c20e735d4995bc95d808 100644 (file)
@@ -303,6 +303,10 @@ struct i40iw_device {
        u32 mr_stagmask;
        u32 mpa_version;
        bool dcb;
+       u32 used_pds;
+       u32 used_cqs;
+       u32 used_mrs;
+       u32 used_qps;
 };
 
 struct i40iw_ib_device {
index b94727ffc86209ff5e9da3a05420ce51811f5eb0..5e2c16c725e3f9e0190296594b4a691925fcf3ea 100644 (file)
@@ -62,7 +62,7 @@ u32 i40iw_initialize_hw_resources(struct i40iw_device *iwdev)
        max_mr = iwdev->sc_dev.hmc_info->hmc_obj[I40IW_HMC_IW_MR].cnt;
        arp_table_size = iwdev->sc_dev.hmc_info->hmc_obj[I40IW_HMC_IW_ARP].cnt;
        iwdev->max_cqe = 0xFFFFF;
-       num_pds = max_qp * 4;
+       num_pds = I40IW_MAX_PDS;
        resources_size = sizeof(struct i40iw_arp_entry) * arp_table_size;
        resources_size += sizeof(unsigned long) * BITS_TO_LONGS(max_qp);
        resources_size += sizeof(unsigned long) * BITS_TO_LONGS(max_mr);
index db9fd31b5c72cf288572358019268b9daee6c97a..9d3b9ee20ba71303810673f63ebad26aec7592a1 100644 (file)
@@ -1557,6 +1557,20 @@ exit:
        return status;
 }
 
+/**
+ * i40iw_get_used_rsrc - determine resources used internally
+ * @iwdev: iwarp device
+ *
+ * Called after internal allocations
+ */
+static void i40iw_get_used_rsrc(struct i40iw_device *iwdev)
+{
+       iwdev->used_pds = find_next_zero_bit(iwdev->allocated_pds, iwdev->max_pd, 0);
+       iwdev->used_qps = find_next_zero_bit(iwdev->allocated_qps, iwdev->max_qp, 0);
+       iwdev->used_cqs = find_next_zero_bit(iwdev->allocated_cqs, iwdev->max_cq, 0);
+       iwdev->used_mrs = find_next_zero_bit(iwdev->allocated_mrs, iwdev->max_mr, 0);
+}
+
 /**
  * i40iw_open - client interface operation open for iwarp/uda device
  * @ldev: lan device information
@@ -1629,6 +1643,7 @@ static int i40iw_open(struct i40e_info *ldev, struct i40e_client *client)
                status = i40iw_initialize_hw_resources(iwdev);
                if (status)
                        break;
+               i40iw_get_used_rsrc(iwdev);
                dev->ccq_ops->ccq_arm(dev->ccq);
                status = i40iw_hmc_init_pble(&iwdev->sc_dev, iwdev->pble_rsrc);
                if (status)
index e65c2baa7db2b690bf073312dbf854d83eef8272..66263fced68f26472eba7088f40352c54f49bc93 100644 (file)
@@ -76,7 +76,8 @@ enum i40iw_device_capabilities_const {
        I40IW_MAX_ORD_SIZE =                    127,
        I40IW_MAX_WQ_ENTRIES =                  2048,
        I40IW_Q2_BUFFER_SIZE =                  (248 + 100),
-       I40IW_QP_CTX_SIZE =                     248
+       I40IW_QP_CTX_SIZE =                     248,
+       I40IW_MAX_PDS =                         32768
 };
 
 #define i40iw_handle void *
index 6b516d6156dc8b0c2a1182ae1d97f4592578c9c3..d20ee118f366b174cf6e94d66ab00c7c4f1f8800 100644 (file)
@@ -67,13 +67,13 @@ static int i40iw_query_device(struct ib_device *ibdev,
        props->vendor_part_id = iwdev->ldev->pcidev->device;
        props->hw_ver = (u32)iwdev->sc_dev.hw_rev;
        props->max_mr_size = I40IW_MAX_OUTBOUND_MESSAGE_SIZE;
-       props->max_qp = iwdev->max_qp;
+       props->max_qp = iwdev->max_qp - iwdev->used_qps;
        props->max_qp_wr = (I40IW_MAX_WQ_ENTRIES >> 2) - 1;
        props->max_sge = I40IW_MAX_WQ_FRAGMENT_COUNT;
-       props->max_cq = iwdev->max_cq;
+       props->max_cq = iwdev->max_cq - iwdev->used_cqs;
        props->max_cqe = iwdev->max_cqe;
-       props->max_mr = iwdev->max_mr;
-       props->max_pd = iwdev->max_pd;
+       props->max_mr = iwdev->max_mr - iwdev->used_mrs;
+       props->max_pd = iwdev->max_pd - iwdev->used_pds;
        props->max_sge_rd = I40IW_MAX_SGE_RD;
        props->max_qp_rd_atom = I40IW_MAX_IRD_SIZE;
        props->max_qp_init_rd_atom = props->max_qp_rd_atom;