RDMA/hns: Encapsulate the qp db as a function
authorYixing Liu <liuyixing1@huawei.com>
Thu, 26 Aug 2021 13:37:35 +0000 (21:37 +0800)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 26 Aug 2021 15:12:21 +0000 (12:12 -0300)
Encapsulate qp db into two functions: user and kernel.

Link: https://lore.kernel.org/r/1629985056-57004-7-git-send-email-liangwenpeng@huawei.com
Signed-off-by: Yixing Liu <liuyixing1@huawei.com>
Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/hns/hns_roce_qp.c

index d45beed..74c9101 100644 (file)
@@ -823,75 +823,104 @@ static inline bool kernel_qp_has_rdb(struct hns_roce_dev *hr_dev,
                hns_roce_qp_has_rq(init_attr));
 }
 
+static int alloc_user_qp_db(struct hns_roce_dev *hr_dev,
+                           struct hns_roce_qp *hr_qp,
+                           struct ib_qp_init_attr *init_attr,
+                           struct ib_udata *udata,
+                           struct hns_roce_ib_create_qp *ucmd,
+                           struct hns_roce_ib_create_qp_resp *resp)
+{
+       struct hns_roce_ucontext *uctx = rdma_udata_to_drv_context(udata,
+               struct hns_roce_ucontext, ibucontext);
+       struct ib_device *ibdev = &hr_dev->ib_dev;
+       int ret;
+
+       if (user_qp_has_sdb(hr_dev, init_attr, udata, resp, ucmd)) {
+               ret = hns_roce_db_map_user(uctx, ucmd->sdb_addr, &hr_qp->sdb);
+               if (ret) {
+                       ibdev_err(ibdev,
+                                 "failed to map user SQ doorbell, ret = %d.\n",
+                                 ret);
+                       goto err_out;
+               }
+               hr_qp->en_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB;
+       }
+
+       if (user_qp_has_rdb(hr_dev, init_attr, udata, resp)) {
+               ret = hns_roce_db_map_user(uctx, ucmd->db_addr, &hr_qp->rdb);
+               if (ret) {
+                       ibdev_err(ibdev,
+                                 "failed to map user RQ doorbell, ret = %d.\n",
+                                 ret);
+                       goto err_sdb;
+               }
+               hr_qp->en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB;
+       }
+
+       return 0;
+
+err_sdb:
+       if (hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB)
+               hns_roce_db_unmap_user(uctx, &hr_qp->sdb);
+err_out:
+       return ret;
+}
+
+static int alloc_kernel_qp_db(struct hns_roce_dev *hr_dev,
+                             struct hns_roce_qp *hr_qp,
+                             struct ib_qp_init_attr *init_attr)
+{
+       struct ib_device *ibdev = &hr_dev->ib_dev;
+       int ret;
+
+       if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09)
+               hr_qp->sq.db_reg = hr_dev->mem_base +
+                                  HNS_ROCE_DWQE_SIZE * hr_qp->qpn;
+       else
+               hr_qp->sq.db_reg = hr_dev->reg_base + hr_dev->sdb_offset +
+                                  DB_REG_OFFSET * hr_dev->priv_uar.index;
+
+       hr_qp->rq.db_reg = hr_dev->reg_base + hr_dev->odb_offset +
+                          DB_REG_OFFSET * hr_dev->priv_uar.index;
+
+       if (kernel_qp_has_rdb(hr_dev, init_attr)) {
+               ret = hns_roce_alloc_db(hr_dev, &hr_qp->rdb, 0);
+               if (ret) {
+                       ibdev_err(ibdev,
+                                 "failed to alloc kernel RQ doorbell, ret = %d.\n",
+                                 ret);
+                       return ret;
+               }
+               *hr_qp->rdb.db_record = 0;
+               hr_qp->en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB;
+       }
+
+       return 0;
+}
+
 static int alloc_qp_db(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
                       struct ib_qp_init_attr *init_attr,
                       struct ib_udata *udata,
                       struct hns_roce_ib_create_qp *ucmd,
                       struct hns_roce_ib_create_qp_resp *resp)
 {
-       struct hns_roce_ucontext *uctx = rdma_udata_to_drv_context(
-               udata, struct hns_roce_ucontext, ibucontext);
-       struct ib_device *ibdev = &hr_dev->ib_dev;
        int ret;
 
        if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_SDI_MODE)
                hr_qp->en_flags |= HNS_ROCE_QP_CAP_OWNER_DB;
 
        if (udata) {
-               if (user_qp_has_sdb(hr_dev, init_attr, udata, resp, ucmd)) {
-                       ret = hns_roce_db_map_user(uctx, ucmd->sdb_addr,
-                                                  &hr_qp->sdb);
-                       if (ret) {
-                               ibdev_err(ibdev,
-                                         "failed to map user SQ doorbell, ret = %d.\n",
-                                         ret);
-                               goto err_out;
-                       }
-                       hr_qp->en_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB;
-               }
-
-               if (user_qp_has_rdb(hr_dev, init_attr, udata, resp)) {
-                       ret = hns_roce_db_map_user(uctx, ucmd->db_addr,
-                                                  &hr_qp->rdb);
-                       if (ret) {
-                               ibdev_err(ibdev,
-                                         "failed to map user RQ doorbell, ret = %d.\n",
-                                         ret);
-                               goto err_sdb;
-                       }
-                       hr_qp->en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB;
-               }
+               ret = alloc_user_qp_db(hr_dev, hr_qp, init_attr, udata, ucmd,
+                                      resp);
+               if (ret)
+                       return ret;
        } else {
-               if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09)
-                       hr_qp->sq.db_reg = hr_dev->mem_base +
-                                          HNS_ROCE_DWQE_SIZE * hr_qp->qpn;
-               else
-                       hr_qp->sq.db_reg =
-                               hr_dev->reg_base + hr_dev->sdb_offset +
-                               DB_REG_OFFSET * hr_dev->priv_uar.index;
-
-               hr_qp->rq.db_reg = hr_dev->reg_base + hr_dev->odb_offset +
-                                  DB_REG_OFFSET * hr_dev->priv_uar.index;
-
-               if (kernel_qp_has_rdb(hr_dev, init_attr)) {
-                       ret = hns_roce_alloc_db(hr_dev, &hr_qp->rdb, 0);
-                       if (ret) {
-                               ibdev_err(ibdev,
-                                         "failed to alloc kernel RQ doorbell, ret = %d.\n",
-                                         ret);
-                               goto err_out;
-                       }
-                       *hr_qp->rdb.db_record = 0;
-                       hr_qp->en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB;
-               }
+               ret = alloc_kernel_qp_db(hr_dev, hr_qp, init_attr);
+               if (ret)
+                       return ret;
        }
 
        return 0;
-err_sdb:
-       if (udata && hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB)
-               hns_roce_db_unmap_user(uctx, &hr_qp->sdb);
-err_out:
-       return ret;
 }
 
 static void free_qp_db(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,