aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaresh Gottumukkala <bgottumukkala@emulex.com>2013-08-07 03:22:37 -0400
committerRoland Dreier <roland@purestorage.com>2013-08-12 14:00:51 -0400
commit45e86b33ec8b33f9ed41d9f9005f9e663018f8f1 (patch)
treeeca311e7455a7edba0c361afdb05996b4b42cb3e
parent7b9b1a596e0f37b463dfe3bc36b6d035c7450ca0 (diff)
RDMA/ocrdma: Cache recv DB until QP moved to RTR
1) In post recv, don't ring the DB doorbell if the QP is in RTR state. Cache the DB calls, until the QP is moved to RTS state. 2) Add max_rd_sge support to dev->attr. 3) Code cleanup in alloc_pd path. Signed-off-by: Naresh Gottumukkala <bgottumukkala@emulex.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma.h2
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_hw.c3
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_sli.h2
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_verbs.c29
4 files changed, 29 insertions, 7 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma.h b/drivers/infiniband/hw/ocrdma/ocrdma.h
index 8d54dc74ca77..e798837f1fe0 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma.h
+++ b/drivers/infiniband/hw/ocrdma/ocrdma.h
@@ -60,6 +60,7 @@ struct ocrdma_dev_attr {
60 int max_send_sge; 60 int max_send_sge;
61 int max_recv_sge; 61 int max_recv_sge;
62 int max_srq_sge; 62 int max_srq_sge;
63 int max_rdma_sge;
63 int max_mr; 64 int max_mr;
64 u64 max_mr_size; 65 u64 max_mr_size;
65 u32 max_num_mr_pbl; 66 u32 max_num_mr_pbl;
@@ -287,6 +288,7 @@ struct ocrdma_qp {
287 u32 qkey; 288 u32 qkey;
288 bool dpp_enabled; 289 bool dpp_enabled;
289 u8 *ird_q_va; 290 u8 *ird_q_va;
291 u16 db_cache;
290}; 292};
291 293
292struct ocrdma_hw_mr { 294struct ocrdma_hw_mr {
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
index c4bb29c9d48a..97bb1ce8d243 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
@@ -992,6 +992,9 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev,
992 attr->max_srq_sge = (rsp->max_srq_rqe_sge & 992 attr->max_srq_sge = (rsp->max_srq_rqe_sge &
993 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >> 993 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >>
994 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET; 994 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET;
995 attr->max_rdma_sge = (rsp->max_write_send_sge &
996 OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_MASK) >>
997 OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT;
995 attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & 998 attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp &
996 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> 999 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >>
997 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; 1000 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT;
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
index 96a962982417..0184009060db 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
@@ -1306,7 +1306,7 @@ struct ocrdma_reg_nsmr_cont {
1306 u32 last; 1306 u32 last;
1307 1307
1308 struct ocrdma_pa pbl[MAX_OCRDMA_NSMR_PBL]; 1308 struct ocrdma_pa pbl[MAX_OCRDMA_NSMR_PBL];
1309} __packed; 1309};
1310 1310
1311struct ocrdma_pbe { 1311struct ocrdma_pbe {
1312 u32 pa_hi; 1312 u32 pa_hi;
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
index 2cfbd343ba0e..5f68dff0d6ca 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
@@ -84,7 +84,7 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr)
84 IB_DEVICE_SYS_IMAGE_GUID | 84 IB_DEVICE_SYS_IMAGE_GUID |
85 IB_DEVICE_LOCAL_DMA_LKEY; 85 IB_DEVICE_LOCAL_DMA_LKEY;
86 attr->max_sge = min(dev->attr.max_send_sge, dev->attr.max_srq_sge); 86 attr->max_sge = min(dev->attr.max_send_sge, dev->attr.max_srq_sge);
87 attr->max_sge_rd = 0; 87 attr->max_sge_rd = dev->attr.max_rdma_sge;
88 attr->max_cq = dev->attr.max_cq; 88 attr->max_cq = dev->attr.max_cq;
89 attr->max_cqe = dev->attr.max_cqe; 89 attr->max_cqe = dev->attr.max_cqe;
90 attr->max_mr = dev->attr.max_mr; 90 attr->max_mr = dev->attr.max_mr;
@@ -327,7 +327,7 @@ int ocrdma_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
327 return status; 327 return status;
328} 328}
329 329
330static int ocrdma_copy_pd_uresp(struct ocrdma_pd *pd, 330static int ocrdma_copy_pd_uresp(struct ocrdma_dev *dev, struct ocrdma_pd *pd,
331 struct ib_ucontext *ib_ctx, 331 struct ib_ucontext *ib_ctx,
332 struct ib_udata *udata) 332 struct ib_udata *udata)
333{ 333{
@@ -337,7 +337,6 @@ static int ocrdma_copy_pd_uresp(struct ocrdma_pd *pd,
337 u32 db_page_size; 337 u32 db_page_size;
338 struct ocrdma_alloc_pd_uresp rsp; 338 struct ocrdma_alloc_pd_uresp rsp;
339 struct ocrdma_ucontext *uctx = get_ocrdma_ucontext(ib_ctx); 339 struct ocrdma_ucontext *uctx = get_ocrdma_ucontext(ib_ctx);
340 struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device);
341 340
342 memset(&rsp, 0, sizeof(rsp)); 341 memset(&rsp, 0, sizeof(rsp));
343 rsp.id = pd->id; 342 rsp.id = pd->id;
@@ -400,14 +399,15 @@ struct ib_pd *ocrdma_alloc_pd(struct ib_device *ibdev,
400 } 399 }
401 400
402 if (udata && context) { 401 if (udata && context) {
403 status = ocrdma_copy_pd_uresp(pd, context, udata); 402 status = ocrdma_copy_pd_uresp(dev, pd, context, udata);
404 if (status) 403 if (status)
405 goto err; 404 goto err;
406 } 405 }
407 return &pd->ibpd; 406 return &pd->ibpd;
408 407
409err: 408err:
410 ocrdma_dealloc_pd(&pd->ibpd); 409 status = ocrdma_mbx_dealloc_pd(dev, pd);
410 kfree(pd);
411 return ERR_PTR(status); 411 return ERR_PTR(status);
412} 412}
413 413
@@ -1090,6 +1090,17 @@ gen_err:
1090 return ERR_PTR(status); 1090 return ERR_PTR(status);
1091} 1091}
1092 1092
1093
1094static void ocrdma_flush_rq_db(struct ocrdma_qp *qp)
1095{
1096 if (qp->db_cache) {
1097 u32 val = qp->rq.dbid | (qp->db_cache <<
1098 ocrdma_get_num_posted_shift(qp));
1099 iowrite32(val, qp->rq_db);
1100 qp->db_cache = 0;
1101 }
1102}
1103
1093int _ocrdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 1104int _ocrdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
1094 int attr_mask) 1105 int attr_mask)
1095{ 1106{
@@ -1108,6 +1119,9 @@ int _ocrdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
1108 if (status < 0) 1119 if (status < 0)
1109 return status; 1120 return status;
1110 status = ocrdma_mbx_modify_qp(dev, qp, attr, attr_mask, old_qps); 1121 status = ocrdma_mbx_modify_qp(dev, qp, attr, attr_mask, old_qps);
1122 if (!status && attr_mask & IB_QP_STATE && attr->qp_state == IB_QPS_RTR)
1123 ocrdma_flush_rq_db(qp);
1124
1111 return status; 1125 return status;
1112} 1126}
1113 1127
@@ -1822,7 +1836,10 @@ static void ocrdma_ring_rq_db(struct ocrdma_qp *qp)
1822{ 1836{
1823 u32 val = qp->rq.dbid | (1 << ocrdma_get_num_posted_shift(qp)); 1837 u32 val = qp->rq.dbid | (1 << ocrdma_get_num_posted_shift(qp));
1824 1838
1825 iowrite32(val, qp->rq_db); 1839 if (qp->state != OCRDMA_QPS_INIT)
1840 iowrite32(val, qp->rq_db);
1841 else
1842 qp->db_cache++;
1826} 1843}
1827 1844
1828static void ocrdma_build_rqe(struct ocrdma_hdr_wqe *rqe, struct ib_recv_wr *wr, 1845static void ocrdma_build_rqe(struct ocrdma_hdr_wqe *rqe, struct ib_recv_wr *wr,