RDMA/hns: Bugfix for creating qp attached to srq
authorLijun Ou <oulijun@huawei.com>
Fri, 9 Aug 2019 09:40:59 +0000 (17:40 +0800)
committerDoug Ledford <dledford@redhat.com>
Tue, 13 Aug 2019 16:32:36 +0000 (12:32 -0400)
When create a qp and attached to srq, rq will no longer be used
and the members of rq will be set zero. As a result, the wrid
of rq will not be allocated and used.

Fixes: 926a01dc000d ("RDMA/hns: Add QP operations support for hip08 SoC")
Signed-off-by: Lijun Ou <oulijun@huawei.com>
Link: https://lore.kernel.org/r/1565343666-73193-3-git-send-email-oulijun@huawei.com
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hns/hns_roce_qp.c

index b729f8e..ec6b5dd 100644 (file)
@@ -854,11 +854,18 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
 
                hr_qp->sq.wrid = kcalloc(hr_qp->sq.wqe_cnt, sizeof(u64),
                                         GFP_KERNEL);
-               hr_qp->rq.wrid = kcalloc(hr_qp->rq.wqe_cnt, sizeof(u64),
-                                        GFP_KERNEL);
-               if (!hr_qp->sq.wrid || !hr_qp->rq.wrid) {
+               if (ZERO_OR_NULL_PTR(hr_qp->sq.wrid)) {
                        ret = -ENOMEM;
-                       goto err_wrid;
+                       goto err_get_bufs;
+               }
+
+               if (hr_qp->rq.wqe_cnt) {
+                       hr_qp->rq.wrid = kcalloc(hr_qp->rq.wqe_cnt, sizeof(u64),
+                                                GFP_KERNEL);
+                       if (ZERO_OR_NULL_PTR(hr_qp->rq.wrid)) {
+                               ret = -ENOMEM;
+                               goto err_sq_wrid;
+                       }
                }
        }
 
@@ -944,8 +951,8 @@ err_wrid:
                    hns_roce_qp_has_rq(init_attr))
                        hns_roce_db_unmap_user(uctx, &hr_qp->rdb);
        } else {
-               kfree(hr_qp->sq.wrid);
-               kfree(hr_qp->rq.wrid);
+               if (hr_qp->rq.wqe_cnt)
+                       kfree(hr_qp->rq.wrid);
        }
 
 err_sq_dbmap:
@@ -956,6 +963,10 @@ err_sq_dbmap:
                    hns_roce_qp_has_sq(init_attr))
                        hns_roce_db_unmap_user(uctx, &hr_qp->sdb);
 
+err_sq_wrid:
+       if (!udata)
+               kfree(hr_qp->sq.wrid);
+
 err_get_bufs:
        hns_roce_free_buf_list(buf_list, hr_qp->region_cnt);